将 class 的私有变量定义为抽象的
Define private variable of class as abstract
我想知道使 class 的私有变量成为抽象变量的正确方法是什么。让我总结一下我的变量的属性:
- 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
我想知道实现此目标的正确方法(欢迎任何与我提到的方法不同的方法)。
编辑: 以下是对我正在尝试做的事情的一些描述:
我有一个管理器AbstractClass
,它有一些与数据库相关的设置操作。它应该是抽象的,因为我不想要这个 class 的任何直接对象。还有一些函数没有定义
ParentClass
是从AbstractClass
派生出来的。它将具有一些与从数据库中获取特定项目相关的功能集。同样,这个 class 也不知道它正在处理的数据库。
ChildClass
实际上将拥有应该与之交互的数据库引擎。由于可以有不同的引擎持有相同类型的信息,我将在此处设置连接名称并基于此连接作为源,ParentClass
的函数将从数据库中获取信息。此外,ChildClass
除了 ParentClass
之外还可以具有其他功能
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的权限。
我想知道使 class 的私有变量成为抽象变量的正确方法是什么。让我总结一下我的变量的属性:
- 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
我想知道实现此目标的正确方法(欢迎任何与我提到的方法不同的方法)。
编辑: 以下是对我正在尝试做的事情的一些描述:
我有一个管理器
AbstractClass
,它有一些与数据库相关的设置操作。它应该是抽象的,因为我不想要这个 class 的任何直接对象。还有一些函数没有定义ParentClass
是从AbstractClass
派生出来的。它将具有一些与从数据库中获取特定项目相关的功能集。同样,这个 class 也不知道它正在处理的数据库。ChildClass
实际上将拥有应该与之交互的数据库引擎。由于可以有不同的引擎持有相同类型的信息,我将在此处设置连接名称并基于此连接作为源,ParentClass
的函数将从数据库中获取信息。此外,ChildClass
除了ParentClass
之外还可以具有其他功能
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的权限。