__名字__
类中的特殊方法内置方法
双下方法
魔术方法 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 = age s1 = Single('aaaa',83) s2 = Single('bbbb',40) print(s1.name) print(s2.name) 结果: bbbb bbbb
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_cls a = Student('asd','55') print(a) q = Student('qwe','66') print(q) print(str(a)) # 内置的数据类型,内置的类,相当于执行__str__ print('学生1 : %s'%a) oldboy 55 asd oldboy 66 qwe oldboy 55 asd 学生1 : oldboy 55 asd