__名字__
类中的特殊方法\内置方法 双下方法 魔术方法 magic_method 类中的每一个双下方法都有它自己的特殊意义
1.__call__ 相当于 对象()
class A: def __call__(self, *args, **kwargs): print('执行call方法了')a = A()a() # 对象() == 相当于调用__call__方法A()()#相当于先实例化得到一个对象,再对对象(),==>和上面的结果一样,相当于调用__call__方法结果:执行call方法了执行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() print('在实例化A之后做一些事情')B(A)在实例化A之前做一些事情执行call方法了在实例化A之后做一些事情
2.__len__ 相当于len(obj)
内置函数和类的内置方法是有联系的
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))结果:3
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.lst)l = mylist()print(len(l))结果:6
len(obj)相当于调用了这个obj的__len__方法 __len__方法return的值就是len函数的返回值 如果一个obj对象没有__len__方法,那么len函数会报错
3.__new__ 特别重要 开辟内存空间的 类的构造方法
单例类
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 = ages1 = Single('aaaa',83)s2 = Single('bbbb',40)print(s1.name)print(s2.name)结果:bbbbbbbb
4.__str__ str(obj), '%s' % obj, print(obj)
class Student: def __str__(self): return '%s %s %s'%(self.school,self.cls,self.name) def __init__(self,name,stu_cls): self.school = 'oldboy' self.name = name self.cls = stu_clsa = Student('asd','55')print(a)q = Student('qwe','66')print(q)print(str(a)) # 内置的数据类型,内置的类,相当于执行__str__print('学生1 : %s'%a)oldboy 55 asdoldboy 66 qweoldboy 55 asd学生1 : oldboy 55 asd