学习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 号的变化

认清现实,放弃幻想。 细节决定成败,心态放好,认真学习与工作。
原文地址:https://www.cnblogs.com/jyf2018/p/14669624.html