簡體   English   中英

使用繼承在Python中創建類變量

[英]Creating class variables in Python with inheritance

我有以下內容:

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實例創建類變量之后。 如何在編譯類Y而不是實例化Y時設置label_type

編輯-我有許多從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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM