今天我在这里遇到了 Python 中元类的一个令人惊讶的定义,元类定义有效地内联。相关部分是
class Plugin(object):
class __metaclass__(type):
def __init__(cls, name, bases, dict):
type.__init__(name, bases, dict)
registry.append((name, cls))
什么时候使用这样的内联定义才有意义?
进一步的论点:
一种说法是创建的元类不能在其他地方使用这种技术重用。一个反驳的论点是,使用元类的一个常见模式是定义一个元类并在一个类中使用它,然后继承该类。例如,在保守的元类中,定义
class DeclarativeMeta(type):
def __new__(meta, class_name, bases, new_attrs):
cls = type.__new__(meta, class_name, bases, new_attrs)
cls.__classinit__.im_func(cls, new_attrs)
return cls
class Declarative(object):
__metaclass__ = DeclarativeMeta
def __classinit__(cls, new_attrs): pass
可以写成
class Declarative(object): #code not tested!
class __metaclass__(type):
def __new__(meta, class_name, bases, new_attrs):
cls = type.__new__(meta, class_name, bases, new_attrs)
cls.__classinit__.im_func(cls, new_attrs)
return cls
def __classinit__(cls, new_attrs): pass
还有其他考虑吗?