我发现大多数人都说在类定义中有括号和没有括号没有区别。但是我的代码输出不同的结果。你知道吗
#!/usr/bin/env python
class Tree(object):
def __init__(self):
self.left = None
self.right = None
self.data = None
root = Tree()
root.data = "root"
root.left = Tree()
root.left.data = "left"
root.right = Tree()
root.right.data = "right"
print(root.left.data)
Output: left
While
#!/usr/bin/env python
class Tree:
def __init__(self):
self.left = None
self.right = None
self.data = None
root = Tree
root.data = "root"
root.left = Tree
root.left.data = "left"
root.right = Tree
root.right.data = "right"
print(root.left.data)
Output : right
那么这背后的问题是什么呢
TLDR公司
但是
冗长的回答
它对类定义没有影响,即
与
但是,如果不调用构造函数,就不能实例化!你知道吗
类实例化和赋值与类赋值
当你这么做的时候
创建一个类
Tree
的新对象,并将其赋给变量tree
。但当你这么做的时候:你“只”说
tree
引用了类Tree
。此后,变量树的值是类Tree
,而不是Tree
的实例。你知道吗因此,当你
所有3个变量
root
、root.left
和root.right
都引用同一个对象,类Tree
。你知道吗所以当你这么做的时候:
不创建新对象,而是将类
Tree
赋给类变量root.right
(class属性),然后将值"right"
赋给Tree
类的data
属性(class属性)。因此,由于对Tree.data
(作为一个类)的最后一个假装是"right"
,那么Tree.data
就是"right"
。你知道吗另外
你知道吗⚠️ 让人困惑的是Python动态添加类属性的能力(请检查这个SO answer for explanations)。在第二段代码中,您从不指向
self.left
、self.right
或self.data
,而是始终指向Tree.left
、Tree.right
和Tree.data
。你知道吗证据
您可以查看:
您还可以检查:
或者最后:
当您说
root=Tree
时,您将类Tree
分配给root。 代码将根的左侧和右侧指定给根本身。 因为最后一个赋值是
root.right.data = "right"
,所以root.data
被赋值right
。 因此root.left.data
取值right
。 您可以尝试打印以下内容:它们都有相同的值。你知道吗
在Python2中,它确实起到了作用。所有类都继承自python3中的
object
。参见more details的答案:无论如何,您应该真的切换到python3,特别是在您刚开始的时候。Python 2will retire于2020年1月1日发布。你知道吗
相关问题 更多 >
编程相关推荐