1 # 内置方法
2 """
3 1.__call__ 相当于 对象加()
4 2.__len__ len(obj)
5 3.__new__ 特别重要 开辟内存空间 类的构造方法
6 4.__str__ str(obj)
7 所有的双下方法 没有需要你外部直接调用的
8 而是总是有一些其他的 内置函数 特殊的语法,来自动触发这些 双下方法
9 """
10 """
11 #__名字__
12 #类中的特殊方法\内置方法
13 #双下方法
14 #魔术方法
15 # 类中的每一个双下方法都有它自己的特殊意义
16 #__call__ flask
17 #__new__ (特别重要)
18 写一个单例类*******
19 # __len__
20 # __str__\ __repr__
21 """
22
23
24 class A:
25 def __call__(self, *args, **kwargs):
26 print('执行call方法')
27
28
29 class B:
30 def __init__(self, cls):
31 print('在A实例化之前做一些事情')
32 self.a = cls()
33 self.a()
34 print('在A实例化之后做一些事情')
35
36
37 # a = A()
38 # a() # 对象加括号 相当于调用__call__方法
39 # # 相当于 a = A()() 类名()() 相当于 实例化得到对象再对对象加括号
40
41 B(A)
42
43
44 # __len__方法
45 # len() dict\tuple\list\set
46 # __iter__ __next__
47 # iter(obj) next()
48
49
50 # 内置函数和类的内置方法是有关系的
51 class mylist:
52 def __init__(self):
53 self.lst = [1, 2, 3]
54 self.name = 'alex'
55 self.age = 83
56
57 def __len__(self):
58 print('执行了__len__了')
59 return len(self.__dict__)
60
61
62 l = mylist()
63 print(len(l)) # len(obj)相当于调用这个obj__len__方法
64
65
66 # __len__方法return的值就是len的返回值
67 # 如果一个obj对象没有__len__方法,那么len函数会报错
68 # print(l.lst)
69 # def iter(obj):
70 # return obj.__iter()
71 #
72 # l = [1,2,3]
73 # iter(l)
74 # # 实现一个类 self.s= ' '
75 # len(obj) str的长度
76 class A:
77 def __init__(self, str):
78 self.str = str
79
80 def __len__(self):
81 return len(self.str)
82
83
84 s = A('sab')
85 print(len(s))
86
87
88 # __new__ # 构造方法
89
90 # __init__ # 初识化方法
91 class Single:
92 def __new__(cls, *args, **kwargs):
93 obj = object.__new__(cls)
94 print('在new方法里面', obj)
95 return obj
96
97 def __init__(self):
98 print('在init方法里面', self)
99
100
101 # 1.开辟一个空间,属于对象
102 # 2.把对象空间传给self,执行init
103 # 3.将这个对象的空间返回给调用者
104
105 a = Single()
106
107
108 # 先调用single的new方法,single没有,只能调用object的new方法
109 # new方法 什么时候执行??
110 # 实例化之后,在init之前,先执行new来创建一开空间
111
112 # 写出一个单例类
113
114 # 单例
115 # 如果一个类,从头到位只能一个实例,说明从头到尾就开辟了一个空间,那么这个类就只能一个单例类
116 class A: pass
117
118
119 # 单例类
120 class Single:
121 __isinstance = None
122
123 def __new__(cls, *args, **kwargs):
124 if not cls.__isinstance:
125 cls.__isinstance = object.__new__(cls)
126 return cls.__isinstance
127
128 def __init__(self, name, age):
129 self.name = name
130 self.age = age
131
132
133 s1 = Single('alex', 83)
134 s2 = Single('taibai', 40)
135 print(s1.name)
136 print(s2.name)
137 # __str__
138 l = [1, 2, 3] # 实例化一个list对象
139 # l 是一个对象
140 print(l)
141
142
143 class Student:
144 def __str__(self):
145 return f'{self.school} {self.cls} {self.name}'
146
147 def __init__(self, name, stu_cls):
148 self.school = 'oldboy'
149 self.name = name
150 self.cls = stu_cls
151
152
153 he = Student('hezewei', 'py14')
154 huang = Student('huangdongyang', 'py14')
155 print(he)
156 print(str(he)) # 内置的数据类型,内置的列类,相当于执行__str__
157 print(f'学生1: {he}')
158 # print一个对象相当于调用一个对象的__str__方法
159 # str(obj),相当于执行obj__str__方法
160 # 格式化输出 也相当于执行__str__方法
161 """
162 1.__call__ 相当于 对象加()
163 2.__len__ len(obj)
164 3.__new__ 特别重要 开辟内存空间 类的构造方法
165 4.__str__ str(obj)
166 所有的双下方法 没有需要你外部直接调用的
167 而是总是有一些其他的 内置函数 特殊的语法,来自动触发这些 双下方法
168 """