day20_3 内置方法
内置方法:
__名字__
他的表述有多种:
类中的特殊方法\内置方法
双下方法
魔术方法 magic_method
类中的每一个双下方法都有它自己的特殊意义
__call__ 相当于 对象()
__len__ len(obj)
__new__ 特别重要 开辟内存空间的 类的构造方法
__call__
class A: def __call__(self, *args, **kwargs): print('执行call方法了') def call(self): print('执行call方法了') class B: def __init__(self,cls): print('在实例化A之前做一些事情') self.a = cls() #self.a = A() self.a() #self.a() ==> A()() ===》相当于执行CALL方法 print('在实例化A之后做一些事情') a = A() a() # 对象() == 相当于调用__call__方法 # a.call()
B(A)
实例化对象a ,再加个()就相当于调用__call__方法
对象 =类名()()也是同理 (
相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法
)
__len__
其实内置函数和类的内置方法是由奸情的
len(dict) /tuple、str、list、set 这些类型都可以计算长度
class mylist: def __init__(self): self.lst = [1,2,3,4,5,6] self.name = 'alex' self.age = 83 def __len__(self): print('执行__len__了') return len(self.__dict__)
l = mylist()
print(len(l))
# len(obj)相当于调用了这个obj的__len__方法
# __len__方法return的值就是len函数的返回值
# 如果一个obj对象没有__len__方法,那么len函数会报错
class My: def __init__(self, s): self.s = s def __len__(self): return len(self.s) my = My('abc') print(len(my)) # 3
__new__
相当于 构造方法
__init__
相当于 初始化方法
class Single: def __new__(cls, *args, **kwargs): # print('在new方法里') obj = object.__new__(cls) print('在new方法里',obj) return obj def __init__(self): print('在init方法里',self)
1.开辟一个空间,属于对象的
2.把对象的空间传给self,执行init
3.将这个对象的空间返回给调用者
obj = Single()
假如single的new,single没有,只能调用object的new方法
new方法在什么时候执行???
在实例化之后,__init__之前先执行new来创建一块空间
单例
如果一个类 从头到尾只能有一个实例,说明从头到尾之开辟了一块儿属于对象的空间,那么这个类就是一个单例类
class A:pass a = A() a2 = A() a3 = A() print(a,a2,a3) #我们实例化三个对象,并不是单例
那如何才能实现单例呢?
class Single: __ISINCTANCE = None def __new__(cls, *args, **kwargs): if not cls.__ISINCTANCE: cls.__ISINCTANCE = object.__new__(cls) return cls.__ISINCTANCE def __init__(self,name,age): # self.name = name # self.age = age print(self) s1 = Single('alex',83) s2 = Single('taibai',40) print(s1.name) print(s2.name) print(s1,s2) #你会发现s1 = s2 实现了单例类
__str__
l = [1,2,3] # 实例化一个list的对象 # 其实l就是一个对象 print(l)
class Student: def __str__(self): return '%s %s %s' % (self.school,self.cls,self.name) # 设置返回的信息 def __init__(self,name,stu_cls): self.school = 'zcdx' self.name = name self.cls = stu_cls he = Student('zxd', 'tongxin1') # print(he) she = Student('cyy', 'wuliu1') # print(she) # print(str(he)) # 内置的数据类型,内置的类,相当于执行__str__ print('学生1 : %s' % he)