【问题标题】:There are class methods. Can I have class attributes?有类方法。我可以有类属性吗?
【发布时间】:2020-03-29 18:38:34
【问题描述】:

考虑基类Base 及其两个子类ChildAChildB 的代码sn-p:

class Base():
    map = {}

    def __init__(self, x):
        type(self).map[x] = self

    @classmethod
    def get_state(cls, x):
        if x in cls.map:
             return cls.map[x]
        return None

class ChildA(Base):
    pass

class ChildB(Base):
    pass

创建实例a = ChildA('foo')并在此之后调用ChildB.get_state('foo')时,返回ChildA的实例。

但是,预期(或者更确切地说是一厢情愿的行为)是Nonemap 属性似乎附加到父类Base,子类共享它。

当然我可以简单地为子类添加一个特定的属性

class ChildA(Base):
    map = {}

class ChildB(Base):
    map = {}

但如果您有许多子类和其中的几个属性,这将是冗长的。有没有办法通过继承Base来解决这个问题?

【问题讨论】:

    标签: python inheritance


    【解决方案1】:

    您可以使用init subclass hook:

    class Base:
        def __init_subclass__(cls, **kwargs):
            cls.map = {}
    

    演示:

    >>> class ChildA(Base): 
    ...     ... 
    ...
    >>> class ChildB(Base): 
    ...     ... 
    ...
    >>> ChildA.map == ChildB.map == {}
    True
    >>> ChildA.map is ChildB.map
    False
    

    【讨论】:

    • 这很完美,我正在考虑创建一个可以执行此操作的类方法,但必须在外部调用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2014-02-13
    • 2020-10-01
    • 2011-01-08
    • 2021-08-18
    • 2011-07-13
    相关资源
    最近更新 更多