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

gat*_*ath 9 python oop

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

示例和链接真的很好.

Ale*_*lli 30

一个抽象方法是一个(在基类)引起NotImplementedError.

像C++一样,抽象类是具有一个或多个抽象方法的任何类.

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

"纯虚拟"方法可能与抽象方法相同.

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

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


S.L*_*ott 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.
Run Code Online (Sandbox Code Playgroud)

"抽象"的概念只有在进行静态类型检查时才有意义,并且需要提醒编译器此类定义中的一个或多个方法中没有正文.它还会警告编译器您无法创建实例.您不需要在Python中使用它,因为这些方法是在运行时动态定位的.尝试使用未定义的方法只是一个AttributeError.

最接近你可以做这种事情.

class AbstractSuperclass( object ):
    def abstractMethod( self ):
        raise NotImplementedError()
Run Code Online (Sandbox Code Playgroud)

它不完全像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'
Run Code Online (Sandbox Code Playgroud)