【发布时间】:2011-12-20 19:15:22
【问题描述】:
我有一个超类,其方法调用仅在其子类中定义的其他方法。这就是为什么当我创建我的超类的一个实例并调用它的方法时,它找不到该方法并引发错误。
这是一个例子:
class SuperClass(object):
def method_one(self):
value = self.subclass_method()
print value
class SubClassOne(SuperClass):
def subclass_method(self):
return 'subclass 1'
class SubClassTwo(SuperClass):
def subclass_method(self):
return 'nubclass 2'
s1 = SubClassOne()
s1.method_one()
s2 = SubClassTwo()
s2.method_one()
c = SuperClass()
c.method_one()
# Results:
# subclass 1
# nubclass 2
# Traceback (most recent call last):
# File "abst.py", line 28, in <module>
# c.method_one()
# File "abst.py", line 4, in method_one
# value = self.subclass_method()
# AttributeError: 'SuperClass' object has no attribute 'subclass_method'
我正在考虑在创建新实例时更改超类的 init 并验证对象的类型。如果对象属于超类,则会引发错误。但是,我不太确定这是否是 Pythonic 的方式。
有什么建议吗?
【问题讨论】:
-
Pythonic 的方式是编写好的文档来解释如何使用你的类。
-
@chown:这实际上在 C++ 中很常见。他所做的本质上是调用虚方法。如果它们是问题的正确解决方案,它们本质上没有任何问题。
-
我同意它不是 Pythonic
-
@chown 您似乎暗示使用抽象类的模式是“一般来说是非编程的”,这是大多数 OO 程序员不同意的。如果
BaseClass定义subclass_method以引发NotImplementedError,除了稍微更好的错误消息之外,这会有什么不同? -
@chown 抽象类的使用几乎不是“百万分之一的场景”。它是面向对象编程的核心部分。 Python 不需要将类正式声明为抽象的;您所要做的就是不实现需要子类实现的方法。但这是完全相同的模式。您声称在基类中引用未实现的抽象方法是“一般来说是非编程的”,但在每种 OO 语言中一直都这样做(并且鼓励)。 OP 所追求的只是一种检测抽象类滥用的方法。
标签: python class oop locking superclass