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

2024-05-19 22:10:56 发布

您现在位置:Python中文网/ 问答频道 /正文

python如何处理面向对象的构造,如abstractvirtualpure virtual

例子和链接将真的很好。在


Tags: abstractpure链接virtual面向对象例子
2条回答

一个抽象的方法是(在基类中)引发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。在

你能做的最接近的事情。在

^{pr2}$

它不完全像java或C++ +{< CD2>}。它是一个具有引发错误的方法的类。但是它的行为非常像一个抽象类,因此非常有用。在

为了匹配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'

相关问题 更多 >