将 class 的私有变量定义为抽象的

Define private variable of class as abstract

我想知道使 class 的私有变量成为抽象变量的正确方法是什么。让我总结一下我的变量的属性:

我的 classes 的结构如下:

from abc import ABCMeta

class AbstractClass(ABCMeta):
    __private_abstract_property = None   # Needs this as private abstract class variable
    # ... some functions


class ParentClass(AbstractClass):   # inherits `AbstractClass`
    # .. some more functions


class ChildClass1(ParentClass):    # inherits `ParentClass`
    __private_abstract_property = 'value1'   # value to be initialized here


class ChildClass2(ParentClass):    # inherits `ParentClass`
    __private_abstract_property = 'value2'

实现这一目标的正确方法是什么?

一种方法是使用 abc.abstractproperty 装饰器作为:

class AbstractClass(ABCMeta):
    @abstractproperty
    def __private_abstract_property(self):
        ...

或者,如 Abstract Attributes in Python 的回答中所述:

class AbstractClass(ABCMeta):
    __private_abstract_property = NotImplemented

我想知道实现此目标的正确方法(欢迎任何与我提到的方法不同的方法)。


编辑: 以下是对我正在尝试做的事情的一些描述:

Python 中没有隐私模型。在 Java 或 C# 名称是私有的意义上,双下划线名称不是私有的;这样的名字是 class private.

Class private 意味着它们受到保护(通过在它们的名称前加上 class 名称作为前缀)免受子 class 中的意外覆盖。这意味着绝对没有必要将双下划线名称放在摘要中class; subclasses 不应该使用完全相同的名称。

参见参考文档的Reserved classes of identifiers section部分:

__*
Class-private names. Names in this category, when used within the context of a class definition, are re-written to use a mangled form to help avoid name clashes between “private” attributes of base and derived classes.

你不应该把任何东西 private 放在抽象基class 中。 ABC 类似于接口,记录 public API subclasses 应该提供。

因此,即使您给名称添加了一个 单个 前导下划线(仅按照约定,表示名称是内部实现的一部分,不能依赖于在其他实现或未来版本中仍然可用),这些不应成为 ABC 的一部分;指示子class如何实现被禁止的方法和属性不是抽象基础class的权限。