python3创建类_细说python类3——类的创建过程

先来介绍一下python的__call__函数,call的作用是什么呢?举个例子来说明一下:

>>> class A(object):

...   def __init__(self):

...     print 'a'

...   def __call__(self):

...     print 'call'

...

>>> a=A()

a

>>> a()

call

据说a()这么使用的时候相当于执行a.__call__(),我们暂且这么理解,具体原因请参考专业文档,这里看可能a()没啥用,请继续向后看。

接下来,说一下类的type,

>>> class B:

...   def __init__(self):

...     print 'b'

...

>>> b=B()

b

>>> type(B)

>>> B

>>> type(b)

>>> type(type(B))

>>> B

由上面例子可以看出类,实例的数据类型。

之后用type函数,创建一个类,type()函数,大致需要以下几个参数,第一个是类的name,第二个是这个类的父类,之后是属性。这里name指的是这里面__main__后面跟的字符。为了保持一致,通常与类的名字一样。

>>> A=type('A',(object,),{'name':'aaa'})

>>> A

可以看出我们的类A已经创建成功

>>> type(A)

但是为什么type(A)类型还是type,而不是呢?因为type(A)和type(type('A',(object,),{'name':'aaa'}))是一样的,我猜classobj就是一个别名,但是我们用最原始的方法没显示别名,所以只显示type,但这不重要,重点是类已经创建了。那么我们自己封装一个类继承type去创建类呢?

>>> class MyType(type):

...   def __init__(self,name,bases,dict):

...     print 'mytype'

...   def __call__(self,*args,**kwargs):

...     print 'mytype call'

这里我们参数和type的源码一致,相当于重写了type的init和call,之后写一个B类,把B的__metaclass__指向myType,

>>> class B:

...   __metaclass__=MyType

...   def __init__(self):

...     print 'b'

>>> b=B()

mytype call

>>> b

实例化一个b,可以看到,执行了MyType的init,但是b并没有生成任何东西。

这里解释一下,当执行b=B()时,需要先找到类内部的__metaclass__并执行,按照__metaclass__顺序先来执行__init__创建一个最初的类,类需要实例化,当我们实例化时会调用metaclass的__call__函数(这样使用B(),就解释了上面的call方法),__call__函数内部正常会调用B类里面的__new__方法来创建一个类的对象,之后会调用B里面的__init__函数给对象进行最初的包装(把相关的参数赋值等操作),最后返回这个类的对象,再把这个对象付赋给b,这样就完成了实例化的过程。因为MyType的__call__方法只打印了一串信息,所以这个实例没有值。也就是说正常创建一个实例对象的其实是new而不是init,init只是起到一个赋值的作用。下面代码模拟一下类的实例化过程:

def __call__(self,*args,**kwargs):

print 'mytype call'

re=self.__new__(self,*args,**kwargs)

self.__init__(re)

return re

class B:

__metaclass__=MyType

def __init__(self):

self.name='b'

print 'B'

def __new__(cls,*args,**kwargs):

return object.__new__(cls,*args,**kwargs)

def Func(self):

print 'Func'

def __call__(self):

print 'call'

b=B()

print b

print b.name

执行结果如下:

mytype

mytype call

B

b

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值