内置函数之 __len__ __new__ __call__ __str__

  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 """

 

posted @ 2021-11-10 20:40  余鑫2020  阅读(31)  评论(0)    收藏  举报