Python:在类中创建抽象静态属性

2024-09-30 02:30:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我真正想做的是:

class X(metaclass=abc.ABCMeta):
    @abc.abstractAttribute # this doesn't exist
    var = [1,2]

class Y(X):
    var = X.var + [3,4]

这将强制X的任何子类实现静态var属性。在

但无法将静态属性定义为抽象属性。在

尝试使用@abc.抽象法,结合物业,我可以接近:

^{pr2}$

y=Y(); y.var根据需要给出{}。在

但目标是创建静态属性/属性,而不是实例属性/属性。在

创建为@staticmethod时:

class X(metaclass=abc.ABCMeta):
    @property
    @staticmethod
    @abc.abstractmethod
    def var():
        return [1,2]

class Y(X):
    @property
    @staticmethod
    def var():
        return X.var + [3,4]

。。。然后y=Y(); y.var给出{}

如果我切换decorator顺序,这将解决staticmethod callable错误:

class X(metaclass=abc.ABCMeta):
    @staticmethod
    @property
    @abc.abstractmethod
    def var():
        return [1,2]

class Y(X):
    @staticmethod
    @property
    def var():
        return X.var + [3,4]

静态方法可以工作,但属性不能按预期工作:y=Y(); y.var返回属性本身,<property at 0x2c16aa1b3b8>。在

This answer接近所需的值,但在这种情况下它不起作用,因为基类X已经有了一个var属性(因此子类可以通过super访问)。在

如何定义一个python类来拥有抽象的静态属性/属性?在


Tags: return属性定义vardef静态property子类
2条回答

也许你的解决方案的一个变体可以工作-而不是使用dict简单地测试父类和子类的静态变量是否是同一个对象。 它适用于子代和插槽,但是折衷的是,如果您用None重写None,或者用同一个对象重写其他对象,那么它将抛出异常,因此它不是完美的。在

class X:
var = [1,2]

def __init_subclass__(cls):
    if X.var is cls.var:
        raise NotImplementedError(
            "Attribute '{}' has not been overriden in class '{}'" \
            .format('var', cls.__name__)
        )

也许我忽略了一些重要的东西,但它在简单的用例中起作用。在

如果您知道解决这个问题的更传统的方法,请告诉我,这种方法也适用于使用__slots__的类。但是对于我的用例,下面的方法是可行的:

class X:
    var = [1,2]

    def __init_subclass__(cls):
        attr_name = 'var'
        if not attr_name in cls.__dict__:
            raise NotImplementedError(
                "Attribute '{}' has not been overriden in class '{}'" \
                .format(attr_name, cls.__name__)
            )

class Y(X):
    # var = X.var + [3,4] # this will work
    pass                  # this won't work

y = Y()

编辑:使用这种方法还有另一个缺点,那就是对于那些没有覆盖的孙子们来说,这将是错误的:

^{pr2}$

我将把这个答案留作空白,以便有人提出更好的替代方案。在

相关问题 更多 >

    热门问题