使用元类

2018-07-24  本文已影响0人  噜噜迅儿

type()函数既可以返回一个对象的类型,又可以创建出新的类型。

def fn(self, name='world'):
    print('hello, %s.' % name)

Hello = type('Hello', (object,), dict(hello=fn))
'''
param name: 类的名称
param bases: 类继承的父类集合
param dict: class的方法名称与函数绑定
'''

通过type()函数创建的类和直接写class是完全一样的,因为Python解释器遇到class定义时,仅仅是扫描一下class定义的语法,然后调用type()函数创建出class。

metaclass

除了使用type()动态创建类以外,要控制类的创建行为,还可以使用metaclass。

先定义metaclass,就可以创建类,最后创建实例。

'''
param cls: 当前准备创建的类的对象;
param name: 类的名字;
param bases: 类继承的父类集合;
param attrs: 类的方法集合。
'''
class ListMetaclass(type):
    def __new__(cls, name, bases, attrs):
        attrs['add'] = lambda self, value: self.append(value)
        return type.__new__(cls, name, bases, attrs)

class Mylist(list, metaclass=ListMetaclass):
    pass

>>> L = MyList()
>>> L.add(1)
>> L
[1]
上一篇 下一篇

猜你喜欢

热点阅读