• 学习python -- 第015天 类与对象的特殊方法与特殊属性


    特殊属性

     1 #
     2 # @author:浊浪
     3 # @version:0.1
     4 # @time: 2021/4/17 9:34
     5 # 
     6 
     7 
     8 class A:
     9     pass
    10 class B:
    11     pass
    12 class C(A,B):
    13     def __init__(self,name,age):
    14         self.name = name
    15         self.age = age
    16 class D(A):
    17     pass
    18 
    19 # 创建C类的对象
    20 shili = C('张三', 18)
    21 print(shili.__dict__)  # {'name': '张三', 'age': 18} 输出实例对象的字典
    22 print(C.__dict__)  # {'__module__': '__main__', '__init__': <function C.__init__ at 0x01A7A8E0>, '__doc__': None}
    23 print('________________________')
    24 print(shili.__class__)  # <class '__main__.C'> 输出实例对象的所属类
    25 print(C.__bases__)  # (<class '__main__.A'>, <class '__main__.B'>) 输出C的父类
    26 print(C.__base__)  # <class '__main__.A'> 输出C的一个父类
    27 print(C.__mro__)  # 输出C类的层次结构 (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

    特殊方法

     1 #
     2 # @author:浊浪
     3 # @version:0.1
     4 # @time: 2021/4/17 9:54
     5 # 
     6 
     7 class Student:
     8     def __init__(self, name):
     9         self.name = name
    10     def __add__(self, other):
    11         return self.name + other.name
    12     def __len__(self):
    13         return len(self.name)
    14 
    15 stu1 = Student('张三')
    16 stu2 = Student('李四')
    17 
    18 s = stu1 + stu2  #实现了两个对象的加法运算(因为在Student类中编写_add()特殊的方法)
    19 print(s)  # 张三李四
    20 x = stu2.__add__(stu1)
    21 print(x)  # 李四张三
    22 
    23 print('----------------------')
    24 
    25 lst = [11, 22, 33, 44, 55]
    26 print(len(lst)) #5
    27 print(lst.__len__()) #5
    28 print(stu1.__len__()) #2

    __new__和__init__方法

    注意第15行代码可以换用

     1 #
     2 # @author:浊浪
     3 # @version:0.1
     4 # @time: 2021/4/17 10:16
     5 # 
     6 
     7 class Person(object):
     8     def __init__(self,name, age):
     9         print('__init__被调用了,self的id值为{0}'.format(id(self)))
    10         self.name = name
    11         self.age = age
    12 
    13     def __new__(cls, *args, **kwargs):
    14         print('__new__被调用了,cls的id值为{0}'.format(id(cls)))
    15         obj = super(Person, cls).__new__()  # 等价于obj = super().__new__(cls)
    16         print('创建的对象id为:{0}'.format(id(obj)))
    17         return obj
    18 
    19 print('object这个类对象的id为:{0}'.format(id(object)))
    20 print('Person这个类对象的id为:{0}'.format(id(Person)))
    21 
    22 # 创建Person类的实例对象
    23 p1 = Person('张三', 20)
    24 print('p1这个类对象实例的id为:{0}'.format(id(p1)))
    25 # 输出如下:
    26 # object这个类对象的id为:140717796113232
    27 # Person这个类对象的id为:2690679899360
    28 # _new__被调用执行了,c1s的id值为2690679899360
    29 # 创建的对象的id为:2690436007104
    30 # _init被调用了,self的id值为:2690436007104
    31 # p1这个Person类的实例对象的id:2690436007104

    具体的传参步骤 :

    1,p1创建对象开始调用new方法(13行) 传参给cls 

    2,cls参数有传递给obj对象(15行)

    3,new方法返回的obj 传递给init方法 作为self参数(8行)

    4,最后self的id就传给了p1

    可参照下图 id 号的变化

    认清现实,放弃幻想。 细节决定成败,心态放好,认真学习与工作。
  • 相关阅读:
    ffmpeg常用命令集合
    Django传文件(FILES用法)
    Flask传文件(files用法)
    docker 部署redis服务
    tomcat启动报错ContainerBase.addChild: start
    Echarts折线图 y轴刻度数值与实际值不符解决方法
    春招日记
    Leetcode5700. 使所有区间的异或结果为零(DP)
    VS2015拖动调整代码窗口奔溃
    图床搭建
  • 原文地址:https://www.cnblogs.com/jyf2018/p/14669624.html
Copyright © 2020-2023  润新知