Python 抽象类 - 如何阻止实例化?

2024-01-05

我有 C# 背景,该语言具有一些内置的“保护开发人员”功能。我知道 Python 采用“我们都是成年人”的方法,并让开发人员有责任深思熟虑、仔细编码。

也就是说,Python 建议采用约定,例如私有实例变量的前导下划线。我的问题是,除了在文档字符串中指定它之外,是否有特定的约定将类标记为抽象类?我在 python 风格指南中没有看到任何特别提到抽象类命名约定的内容。

到目前为止我可以想到 3 个选项,但我不确定它们是否是好主意:

  1. 在类上方的文档字符串中指定它(可能会被忽略)
  2. 在类名中使用前导下划线(不确定这是否被普遍理解)
  3. 创建一个def __init__(self):抽象类上的方法引发错误(不确定这是否会对继承产生负面影响,例如您是否想调用基本构造函数)

其中之一是不错的选择还是有更好的选择?我只是想确保其他开发人员知道它是抽象的,因此如果他们尝试实例化它,他们应该对任何奇怪的行为承担责任。


如果您使用的是 Python 2.6 或更高版本,则可以使用抽象基类 http://docs.python.org/2/library/abc.html如果您想增强抽象性,请使用标准库中的模块。这是一个例子:

from abc import ABCMeta, abstractmethod

class SomeAbstractClass(object):
    __metaclass__ = ABCMeta

    @abstractmethod
    def this_method_must_be_overridden(self):
        return "But it can have an implementation (callable via super)."

class ConcreteSubclass(SomeAbstractClass):
    def this_method_must_be_overridden(self):
        s = super(ConcreteSubclass, self).this_method_must_be_overridden()
        return s.replace("can", "does").replace(" (callable via super)", "")

Output:

>>> a = SomeAbstractClass()
Traceback (most recent call last):
  File "<pyshell#13>", line 1, in <module>
    a = SomeAbstractClass()
TypeError: Can't instantiate abstract class SomeAbstractClass with abstract
methods this_method_must_be_overridden
>>> c = ConcreteSubclass()
>>> c.this_method_must_be_overridden()
'But it does have an implementation.'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 抽象类 - 如何阻止实例化? 的相关文章

随机推荐