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

2024-04-18 17:24:36 发布

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

我想使用一个抽象基类来强制实现一个具体类中的属性。我知道如何使用@abc.abstractproperty强制实现泛型属性。关于如何做到这一点,有很多答案-我已经阅读了其中的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

Tags: to实例return属性定义foodef错误