【发布时间】:2009-06-15 04:15:32
【问题描述】:
python如何处理abstract、virtual、pure virtual等面向对象的结构
例子和链接真的很好。
【问题讨论】:
-
其他语言对多重继承、动态方法定义、动态属性定义、运算符重载等OO结构做了什么?为什么不问问其他语言缺少的 Python 功能?
python如何处理abstract、virtual、pure virtual等面向对象的结构
例子和链接真的很好。
【问题讨论】:
抽象方法是(在基类中)引发NotImplementedError的方法。
抽象类,就像在 C++ 中一样,是具有一个或多个抽象方法的任何类。
Python 中的所有方法都是虚拟的(即,所有方法都可以被子类覆盖)。
“纯虚拟”方法可能与抽象方法相同。
在每种情况下,您都可以尝试使用深奥的黑魔法来对抗语言,但这样做(一般来说)非常愚蠢。
我一直在努力处理两本书、十几个视频、两打论文和 PDF 以及其他演示文稿中的“等”部分,而接下来的几天我不能在这里总结所有内容。问具体的问题,我很乐意尝试回答!
【讨论】:
“python如何处理抽象、虚拟、纯虚拟等面向对象的结构”
这些是语言结构而不是 OO 结构。有人可能会争辩说,抽象是一个与语言无关的概念(尽管 Python 不需要它。)虚拟和纯虚拟是 C++ 的实现细节。
有两个 OO 结构在 Python 中不是必需的,但有时很有用。
当 (1) 具有单一继承和 (2) 具有静态类型检查时,“接口”的概念是有意义的。由于 Python 具有多重继承且没有静态类型检查,因此该概念几乎无关紧要。
但是,您可以定义类似于“接口”的超类,这些超类实际上除了定义接口之外不做任何事情。它对文档很方便。一个成语如下。
class InterfaceMixin( object ):
def requiredMethod( self ): raise NotImplemntedError()
class RealClass( SuperClass, InterfaceMixin ):
def requiredMethod( self ):
# actual implementation.
“抽象”的概念只有在您进行静态类型检查并且您需要提醒编译器此类定义中的一个或多个方法中没有主体时才有意义。它还提醒编译器您不能创建实例。在 Python 中不需要这个,因为这些方法是在运行时动态定位的。尝试使用未定义的方法只是AttributeError。
你可以做这种事情的最接近的。
class AbstractSuperclass( object ):
def abstractMethod( self ):
raise NotImplementedError()
它并不完全像 Java 或 C++ abstract。这是一个带有引发错误的方法的类。但它的行为足以像抽象类一样有用。
要匹配 Java,您必须阻止创建实例。这需要您覆盖__new__。如果您这样做了,那么您的具体子类将需要实现 __new__,这很让人头疼,因此我们很少采取积极措施来防止创建应该是抽象的东西的实例。
“虚拟”和“纯虚拟”的概念是强制方法查找的 C++ 优化。 Python 总是这样做。
编辑
没有明确方法定义的抽象示例。
>>> class Foo( object ):
... pass
...
>>> f= Foo()
>>> f.bar()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Foo' object has no attribute 'bar'
【讨论】: