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

标签 python properties static attributes abstract-class

我真正想做的是这样的:

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.abstractmethod,结合属性,我可以接近:

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

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

y=Y(); y.var给出 [1,2,3,4]随心所欲。

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

当创建为@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给出 TypeError 'staticmethod' object is not 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 类?

最佳答案

如果它是一个属性的要求是灵活的,你可以只定义一个静态抽象方法:

class X:
  @staticmethod
  @abstractmethod
  def var():
    pass

class Y(X):
  @staticmethod
  def var():
    return [1, 2]

>>> Y.var()
[1, 2]

关于Python:在类中创建抽象静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49022656/

相关文章:

python - 如何绕过 python 请求 SSL 和代理错误?

objective-c - iOS 获取属性类

spring-boot - 防止 spring boot 将属性解析为科学记数法

ios - 你如何覆盖只读属性以在子类中读写

java - 如果引用的静态字段是最终的,为什么不执行静态初始值设定项

java - 为什么我的代码对非静态进行静态引用?怎么修?

python - 在 Django PostgreSQL 中排序太慢

python - 应用于像素值时,相同的数学和 numpy 函数不会给出相同的结果

python - xlwings for Excel for Mac 2016

java - 如何在另一个类中访问一个类的变量而不将它们设为静态?