[英]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.