Python 类特殊成员
1.对象可以作为函数调用 __call__方法
1 class Foo(object): 2 def __init__(self): 3 print('init') 4 5 def __call__(self, *args, **kwargs): 6 print('call') 7 f=Foo() 8 f()#call
当对象作为函数调用时,实际执行的是类中的__call__方法
2.对象被其他内置函数转换时场景
1 class Foo(object): 2 def __init__(self,name,age): 3 print('init') 4 self.name=name 5 self.age=age 6 def __call__(self, *args, **kwargs): 7 print('call') 8 def __int__(self): 9 return 111 10 def __str__(self): 11 return ('%s-%s'%(self.name,self.age)) 12 def __add__(self, other): 13 # return self.age+other.age 14 return Foo(self.name,self.age) 15 f=Foo('Alex',19)#调用对象内部__init__方法 16 f1=Foo('Eric',34) 17 f()#调用对象内部__call__方法 18 ret=int(f)#调用对象内部__int__方法 19 print(ret) 20 ret2=str(f)#调用对象内部的__str__方法 21 print(ret2) 22 ret3=f+f1 23 print(ret3,type(ret3))
总结:
__init__ 类()自动执行
__call__ 对象()自动执行 或者 类()()自动执行
__int__ int(对象)
__str__ str(对象)
__add__ 对象+对象
__del__ 析构方法,当对象呗销毁时自动执行
__dict__ 将对象(类)中封装的所有内容通过字典的形式返回
__getitem__ 对象[item]方法
__setitem__ 对象[item]=value方法
__delitem__ del 对象[item]方法
__iter__ 如果对象中存在此方法,则此对象为可迭代对象==》对象.__iter__生成迭代器,迭代器.next()方法获取值
3.metaclass,类始祖
一切事物皆为对象
通过类创建对象时,类本身也是一个对象,是type的类
1 class Foo(): 2 def func(self): 3 print('haha') 4 5 def function(self): 6 print('haha') 7
class Foo():
def func(self):
print('haha')
def function(self):
print('haha')
Foo=type('Foo',(object,),{'func':function})
Foo=type('Foo',(object,),{'func':function}) 创建类:第一个参数类名,第二个参数继承的父类,第三个参数类中的成员
类都是type的对象,对象都是类的对象
1 class Mytype(type): 2 def __init__(self,*args,**kwargs): 3 print(123) 4 def __call__(self, *args, **kwargs): 5 print(456) 6 class Foo(object,metaclass=Mytype): 7 def func(self): 8 print('1234') 9 f=Foo()#Foo是Mytype的对象,首先执行M有type的__init__方法,Foo()调用Mytype的__call__方法 10 #123 先执行 11 #456 后执行
一个普通的类实例化过程为:调用type类的__init__方法,调用type类的__call__方法,然后调用普通类的__new__方法,然后执行普通类的__init__方法
浙公网安备 33010602011771号