我有以下内容:
class X(object):
def __init__(self, *args, **kwargs):
type(self).label_type = xyzzy(self.__class__.__name__)
class Y(X):
def __init__(self, *args, **kwargs):
super(Y, self).__init__(self, *args, **kwargs)
当我创建Y的新实例时,使用Y
而不是X
创建了一个名为label_type
的类变量。这很好,工作正常。
但是让我恼火的是,我必须等到有一个Y的实例才创建类变量。我怎么能设置label_type
时,类Y被编译,而不是当它被实例化?
编辑-我有许多子类是从X派生的。我想把尽可能多的工作推到X。
您可以使用元类来做这类事情。下面是一个简单的示例:
class NameLabelMeta(type):
def __new__(meta, name, bases, dct):
"""Create a new class and label it with its name."""
cls = super(NameLabelMeta, meta).__new__(meta, name, bases, dct)
cls.label_type = name # or xyzzy(name), or whatever
return cls
在使用:>>> class X(object):
__metaclass__ = NameLabelMeta # 2.x syntax
>>> class Y(X):
pass
>>> Y.label_type
'Y'
请注意,Y
透明地继承了X
的元类,因此根本不需要实现任何正确的行为。它也更有效,因为它不会在每次创建类的新实例时再次发生。
需要动态设置label_type
吗?为什么不使用像
class X(object):
LABEL_TYPE = 'X'
class Y(X):
pass
print Y().LABEL_TYPE # Prints 'X'