Python中面向对象构造的等效是什么?

9 投票
2 回答
2132 浏览
提问于 2025-04-15 12:15

Python是怎么处理面向对象的概念,比如抽象虚拟纯虚拟这些的呢?

如果能给一些例子和链接就更好了。

2 个回答

7

“Python是怎么处理面向对象的概念,比如抽象、虚拟、纯虚拟等的?”

这些其实更多是语言的特性,而不是面向对象的特性。有人可能会说,抽象是一个和语言无关的概念(虽然Python不需要这个)。虚拟和纯虚拟是C++中的实现细节。

在Python中,有两个面向对象的概念并不是必须的,但有时候会很有帮助。

当你有单继承和静态类型检查时,“接口”的概念才有意义。由于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'
31

一个抽象方法是在基类中会抛出NotImplementedError的那种方法。

抽象类就像在C++中一样,是指任何包含一个或多个抽象方法的类。

在Python中,所有的方法都是虚拟的(也就是说,所有的方法都可以被子类重写)。

一个“纯虚拟”方法大概和抽象方法是一样的意思。

在这些情况下,你可以尝试一些复杂的技巧来对抗语言的规则,但一般来说,这样做是非常愚蠢的。

我努力在两本书、十几个视频、二十多篇文章和其他演示中处理了“等等”的部分,我不能在接下来的几天里把这些内容都总结在这里。如果你有具体的问题,我很乐意尝试回答!

撰写回答