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__方法

posted on 2018-01-17 23:22  可爱的春哥  阅读(102)  评论(0)    收藏  举报

导航