python 元类的call总结_python中的元类总结

python中的元类总结:

元类实际上做了以下三方面的工作:

干涉创建类的过程

修改类

返回修改之后的类

总结一句话,动态的创建类

元类查找的顺序:

首先检查Foo中是否具有属性metaclass?

如果找到,就使用metaclass定义的元类在内存中创建一个类对象。

如果在类定义中没有找到这个属性,就在模块级别中进行查找。

如果还是没有找到,就会使用父类Bar中的元类来创建类。

metaclass里面方法的顺序:

__new__: 用于动态创建每一个类,这样在创建的过程中,修改类的属性方法等,只有在类的生成是调用一次

__init__: 这个方法在new完成后,用来给属性和方法初始化,类生成时候调用一次

__call__: 每次生成类的对象时候,调用一次,然后调用类自己的init函数,所以可以在__call__里面做一下生成对象时候统计

代码示例:

# -*- coding:utf8 -*-

class Basic(type):

count = 0

def __new__(cls, name, bases, newattrs):

print "new: %r %r %r %r" % (cls, name, bases, newattrs)

return super(Basic, cls).__new__(cls, name, bases, newattrs)

def __call__(self, *args):

print "call: %r %r" % (self, args)

self.count += 1

return super(Basic, self).__call__(*args)

def __init__(cls, name, bases, newattrs):

print "init: %r %r %r %r" % (cls, name, bases, newattrs)

super(Basic, cls).__init__(name, bases, dict)

class Foo:

__metaclass__ = Basic

def __init__(self, *args, **kw):

print "init: %r %r %r" % (self, args, kw)

a = Foo('a')

print a.count

b = Foo('b')

print a.count

c = Foo('c')

print a.count

结果:

new: 'Foo' () {'__module__': '__main__', '__metaclass__': , '__init__': }

init: 'Foo' () {'__module__': '__main__', '__metaclass__': , '__init__': }

call: ('a',)

init: <__main__.foo object at> ('a',) {}

1

call: ('b',)

init: <__main__.foo object at> ('b',) {}

2

call: ('c',)

init: <__main__.foo object at> ('c',) {}

3

参考链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值