【问题标题】:Python class inheritance: how is this output produced?Python 类继承:这个输出是如何产生的?
【发布时间】:2018-10-30 05:26:51
【问题描述】:

当我运行此代码时,它给出的输出为 10 10 10 12 24 10。谁能帮助我理解输出?我是 python 编程新手

class A:
    x = 10

class B(A):
    pass

class C(A):
    pass

print (A.x)

print (B.x)

print (C.x)

A.x += 2

B.x *= 2

C.x -= 2

print (A.x)

print (B.x)

print (C.x)

【问题讨论】:

  • 欢迎来到 Stack Overflow!不幸的是questions asking for: books, libraries, tutorials, tools are off-topic,应该关闭。 Stack Overflow 是一个 QuestionsAnswers 网站,用于解决特定的编程问题。
  • 你能证明自己任何努力解决这个问题吗?
  • 为什么在 Python 代码中需要使用class 而不是def(函数)?为什么只是 class ?为什么需要解释示例代码?我认为,您的代码演示了一个类从另一个基类的继承:class main_class(base_class): 但最好是 Python 教科书或手册:docs.python.org/2/tutorial/classes.html
  • 我认为这是一个非常有趣的问题。 B.x*=2 创建一个新对象。在它只是对 A.x. 的引用之前。 Amd 然后 C.x 仍然引用 A.x 因此你最后得到 10。请更新标题并添加对您的具体问题的描述(您期望什么以及与您的期望有什么不同)。如果你这样做,我将收回我的反对票。

标签: python class oop object inheritance


【解决方案1】:

我不知道您知道哪些编程语言,但 Python 在这里的工作方式与其他语言不同。在 C++ 中,您只需假设变量 x 作为自己的实例存在 3 次,这意味着变量彼此独立。这将导致输出序列 10 10 10 12 20 8。

但是,我认为对于 Python,这里会发生以下情况:

  • 您使用变量 x = 10 创建类 A。创建类 B 和 C 时,它们不会实例化自己的变量 x。相反,B 和 C 对 A.x. 有一个“参考”。这就是为什么你一开始会得到 10 10 10。
  • 您将 A.x += 2 更改为现在 x = 12。当您更改 B.x *= 2 时,将对 B.x 进行以下赋值:B.x = A.x * 2。从这一刻起,B.x 是一个自己的变量,独立于 A.x。 C.x -= 2 也是如此。这将导致您得到序列 12 24 10。

我认为对于 Python,您需要了解“按对象调用”的概念,它无处不在。它不同于“按值调用”或“按引用调用”等已知概念。另见Is Python call by reference or value

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    相关资源
    最近更新 更多