java - Python 中的 OOP 范式

标签 java c++ python oop

这是我一直怀疑的事情。考虑以下代码段。

class A(object):
    def check(self):
        super(A, self).check()
        print "inside a"

class B(object):
    def check(self):
        print "inside b"

class C(A, B):
    pass

c = C()
c.setup()

现在这给出了输出,

inside b
inside a

通过 pdb 传递它,我看到在到达 A.setup() 时,正在调用 B.setup()。但是,A 的调用是对其父类(super class)的检查方法;因为它不存在,调用从那个点移动到 B.check()。

  1. 有人可以解释一下或给我指点一份说明其内部工作原理的文档吗?我找不到任何东西。
  2. 有人可以用 C++/Java 向我展示类似的实现吗?我认为将它与其他语言进行比较会帮助我更好地理解手头的问题。

非常感谢。

最佳答案

该算法在 this excellent article 中进行了解释.

简而言之,

super(A,self)self.__class__.__mro__ 中查找 after A 的下一个类.

在你的例子中,selfc,所以 self.__class__CC.__mro__[C,A,B,object]。因此 MRO 中 A 之后的下一个类恰好是 B

因此 super(A,self) 返回一个 super 对象,就属性查找而言,它的行为类似于 B

super(A, self).check() 调用 B.check()

The C3 algorithm用于生成 MRO(方法解析顺序)的 Python 在 this essay 中也有更详细的描述。作者:Michele Simionato。

关于java - Python 中的 OOP 范式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3175714/

相关文章:

java - Android IDE 不创建 Main.java 或 XML

java - Spring /hibernate/Oracle : ORA-02289 Sequence Does Not Exist?

c++ - 了解 std::string_view 的不同构造

c++ - boost 正则表达式链接 : Can't find library

python - np.correlate() 和 signal.fftconvolve() 给出了不同的答案

Android/Python 如何验证签名 SHA256withRSA 和 PKCS1 填充

java - 根据 HashMap 的值字段对 HashMap 的数组列表进行排序

java - 使用 GATE 进行 Multi-Tenancy

c++ - 如何将 256 的无符号整数除以更接近的值?

python - 有没有一种官方方法可以在 GTK 中创建离散值范围小部件?