特殊属性
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 号的变化