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

python中的面向对象构造的等价物是什么?,python,oop,Python,Oop,python如何处理面向对象的构造,例如抽象、虚拟、纯虚拟等 示例和链接真的很好。抽象方法是(在基类中)引发NotImplementedError的方法 抽象类,像C++一样,是任何一个具有一个或多个抽象方法的类。 Python中的所有方法都是虚拟的(即,所有方法都可以被子类重写) “纯虚拟”方法可能与抽象方法相同 在每一种情况下,你都可以尝试使用深层黑魔法来对抗这种语言,但是(一般来说)这样做是非常愚蠢的 我已经努力在两本书、十几个视频、二十多篇文章、PDF和其他演示文稿中处理“etc”部分,

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


示例和链接真的很好。

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

抽象类,像C++一样,是任何一个具有一个或多个抽象方法的类。 Python中的所有方法都是虚拟的(即,所有方法都可以被子类重写)

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

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

我已经努力在两本书、十几个视频、二十多篇文章、PDF和其他演示文稿中处理“etc”部分,我不能在接下来的几天里在这里总结所有内容。问一些具体的问题,我很乐意尝试回答

“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++ >代码>抽象<代码>。它是一个具有引发错误的方法的类。但它的行为足够像一个抽象类,因此非常有用

要匹配Java,必须防止创建实例。这要求您覆盖
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。如果您这样做了,那么您的具体子类将需要实现
\uuuuu new\uuuuuuuu
,这是一个棘手的问题,因此我们很少采取主动步骤来阻止创建应该是抽象的东西的实例

“虚拟”和“纯虚拟”的概念是强制方法查找的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'
>>类Foo(对象):
...     通过
... 
>>>f=Foo()
>>>f.bar()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:“Foo”对象没有属性“bar”

即使9年多前史蒂夫·霍尔顿授予我这个头衔,我也没有做过这样的事,请看--Martellibot Mark 1具有完全的欧洲风味,并在其输出中添加了一种世界性的语言学风格,将外国语言的参考加入其中。它在整体博学方面与音鼓相似,但与音鼓不同的是,它倾向于沉迷于火焰战(我相信,这主要是为了让我们相信它是人类)。[[Steve Holden,2000年12月13日]”。还没有——我写的是9997(当时是9999,现在要调查一下)。在那里,希望我能帮助你越过边缘!(上坡?)其他语言对OO构造(如多重继承、动态方法定义、动态属性定义、运算符重载等)做了什么?为什么不询问其他语言缺少的Python功能?在第一个示例中,出现了错误的异常:输入错误。