我想使用抽象基类来强制在具体类中实现类属性。我知道如何使用@abc.abstractproperty
强制实现通用属性。关于如何做到这一点有很多SO答案 - 我已经阅读了其中的10个:)但我想确保具体类必须将抽象属性定义为类属性而不是实例属性。有谁知道怎么做?
已编辑以解决问题:
我有用户将从ABC定义具体的类。某些抽象属性需要作为类属性“具体化”。检查需要在第一次实例化具体类时发生 - 而不是更快。理想情况下,如果他们错误地将抽象属性定义为实例属性,则会引发一个标记其错误的TypeError。
关键是对于具体类的所有实例,class属性的值应该相同。
我想我错过了一些关于Python内部的知识,这些知识可以帮助我正确地解决这个问题......
import abc
class MyABC(object):
__metaclass__ = abc.ABCMeta
@abc.abstractproperty
def foo():
return 'we never run this line'
# I want to enforce this kind of subclassing
class GoodConcrete(MyABC):
@classmethod
def foo(cls):
return 1 # value is the same for all class instances
# I want to forbid this kind of subclassing
class BadConcrete(MyABC):
def foo(self, val):
self.foo = val