使用抽象基类来强制实现类属性?

时间:2017-05-01 22:46:06

标签: python abstract-class

我想使用抽象基类来强制在具体类中实现属性。我知道如何使用@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

0 个答案:

没有答案