【问题标题】:What is the equivalent of object oriented constructs in python?python中面向对象构造的等价物是什么?
【发布时间】:2009-06-15 04:15:32
【问题描述】:

python如何处理abstractvirtualpure virtual等面向对象的结构

例子和链接真的很好。

【问题讨论】:

  • 其他语言对多重继承、动态方法定义、动态属性定义、运算符重载等OO结构做了什么?为什么不问问其他语言缺少的 Python 功能?

标签: python oop


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 即使史蒂夫·霍尔登 9 多年前授予我这个头衔,我也没有做过这样的事情,请参阅 amk.ca/quotations/python-quotes/page-8 -- “Martellibot Mark 1 具有完全的欧洲风味,并增添了国际化的气息语言学的输出,在其中散布外语参考文献。它在整体博学方面与 timbot 相似,但可以通过它沉迷于火焰战争的倾向与它区分开来(我相信,它主要是为了让我们相信它是人类)。[[史蒂夫霍尔顿,2000 年 12 月 13 日]]”。
  • 还没有——我写的时候是 9997(当时是 9999,然后被否决了,现在要调查一下)。
  • 好了,希望我能帮助你超越边缘! (上坡?)
【解决方案2】:

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

【讨论】:

  • 在您的第一个示例中引发了错误的异常:TypoError。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
相关资源
最近更新 更多