一、__call__方法:
class A: def __call__(self,*args,**kwargs): print(print('执行了call方法了')) class B: def __init__(self, cls): self.a = cls() self.a() # a = A() # a() # 相当于执行了call方法 # a2= A()() # a2 # 相当于执行了call方法 B(A) # 相当于执行了call方法,并且可以再执行call方法之前或者之后做某事
二、__len__方法
class mylist: def __init__(self): self.lst = [1,2,5] def __len__(self): print('执行了__len__了') return len(self.lst) l = mylist() print(len(l)) # len(obj)相当于这个obj的__len__方法 # __len__方法return的值就是len函数的返回值 # 如果一个obj对象没有__len__方法,那么len函数会报错 class str_len: def __init__(self, str): self.str = str def __len__(self): return len(self.str) l = str_len('12345679') print(len(l))
在开辟一个空间的时候,__init__之前执行__new__方法
class Single: def __new__(cls, *args, **kwargs): print('在new方法里面', ) return object.__new__(cls) def __init__(self): print('init') Single()
class Single: def __new__(cls, *args, **kwargs): obj = object.__new__(cls) print('在new方法里面', obj) return obj def __init__(self): print('init', self) Single()
# 单例类:整个类只能实例化一个对象(只开辟一个空间) class Single: __ISIN = None def __new__(cls, *args, **kwargs): if not cls.__ISIN: cls.__ISIN = object.__new__(cls) return cls.__ISIN def __init__(self, name, age): self.name = name self.age = age s1 = Single('Alex', 20) print(s1) s2 = Single('wusir', 40) print(s2) print(s1.name) print(s2.name)
四、__str__方法
打印(print)对象的时候会运行__str__方法
class Student: def __str__(self): # 打印(print)对象的时候会运行__str__方法 return '%s %s'%(self.name, self.stu_cls) def __init__(self, name, stu_cls): self.stu_cls = stu_cls self.name = name s1 = Student('heziwei', 15) print(s1) s2 = Student('huangdongmei', 16) print(s2) print(str(s1)) # 相当于执行__str__方法