我有 C# 背景,该语言具有一些内置的“保护开发人员”功能。我知道 Python 采用“我们都是成年人”的方法,并让开发人员有责任深思熟虑、仔细编码。
也就是说,Python 建议采用约定,例如私有实例变量的前导下划线。我的问题是,除了在文档字符串中指定它之外,是否有特定的约定将类标记为抽象类?我在 python 风格指南中没有看到任何特别提到抽象类命名约定的内容。
到目前为止我可以想到 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(使用前将#替换为@)