python中面向对象构造的等价物是什么?

时间:2009-06-15 04:15:33

标签: python oop

python如何处理面向对象的构造,例如抽象虚拟纯虚拟

示例和链接确实很好。

2 个答案:

答案 0 :(得分:30)

抽象方法是(在基类中)引发NotImplementedError的方法。

抽象类,如C ++,是任何具有一个或多个抽象方法的类。

Python中的所有方法都是虚拟的(即,所有方法都可以被子类覆盖)。

“纯虚拟”方法可能与抽象方法相同。

在每种情况下,你都可以尝试使用深黑魔法来对抗语言,但这样做(一般来说)会非常愚蠢。

我努力处理两本书中的“等”部分,十几个视频,二十几篇论文和PDF以及其他演示文稿,我不能在接下来的几天里总结这一切。询问具体的问题,我很乐意尝试回答!

答案 1 :(得分:7)

“python如何处理面向对象的构造,如抽象,虚拟,纯虚等等。”

这些语言结构比OO结构更多。有人可以说抽象是一种与语言无关的概念(即使Python不需要它。)Virtual和Pure Virtual是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总是这样做。


修改

没有显式方法定义的Abstract示例。

>>> 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'