用继承在Python中创建类变量



我有以下内容:

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'

最新更新