Python类定义语法(括号)
我发现大多数人都说在类定义中有括号和没有括号没有区别。但是我的代码为它输出不同的结果Python类定义语法(括号),python,Python,我发现大多数人都说在类定义中有括号和没有括号没有区别。但是我的代码为它输出不同的结果 #!/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.da
#!/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
那么,在Python2中,这背后的问题是什么呢?它确实起到了作用。所有类都继承自Python 3中的
object
。请参见以下答案:
无论如何,您都应该切换到Python3,特别是在您刚开始的时候。Python 2于2020年1月1日发布。TLDR
类树:通过
#相当于(在Python3中)
类树(对象):传递
#类声明
但是
tree=tree()
#不一样
树
#类实例化
长话短说 它在类定义中没有区别,即
类树(对象):传递
对
类树:通过
但是,如果不调用构造函数,就不能实例化
类实例化和赋值与类赋值
当你这样做的时候
tree=tree()#实例化和赋值
创建类树的新对象,并将其分配给变量树
。但当你这样做的时候:
tree=tree#仅分配
“仅”表示树
引用了类树
。此后,变量树的值是类树
,而不是树
的实例
因此,当你
root=Tree
root.right=树
root.left=树
所有3个变量root
、root.left
和root.right
都引用同一个对象,即类树
所以当你这样做的时候:
root.right.data=“right”
您不创建新对象,而是将类树
分配给类变量root.right
(类属性),然后将值“right”
分配给树
类的数据
属性(类属性)。因此,由于对Tree.data
(作为一个类)的最后一个影响是“right”
,那么Tree.data
就是“right”
另外
⚠️ 让人困惑的是Python动态添加类属性的能力(选中此项)。在第二个代码中,您从不指向self.left
、self.right
或self.data
,而是始终指向Tree.left
、Tree.right
和Tree.data
校样
您可以查看:
类树:通过
根=树
root.data=“root”
root.left=树
root.left.data=“left”
root.right=树
root.right.data=“右”
打印(root.data)#打印“右”
打印(root.left.data)#打印“right”
打印(root.right.data)#打印“right”
您还可以检查:
x=Tree()
打印(x,类型(x))
#
y=树
打印(y,类型(y))
#
或者最后:
类树:通过
根=树
root.left=树
print(root==root.left)#True,因为引用了类
根=树()
root.left=Tree()
print(root==root.left)#False,因为引用了两个不同的实例
当您说root=Tree
时,您是在将类Tree
分配给root。
代码
root = Tree
root.left = Tree
root.right = Tree
将根的左侧和右侧指定给根本身。
由于最后一次赋值是root.right.data=“right”
,root.data
被赋值为right
。
因此root.left.data
取right
的值。
您可以尝试打印以下内容:
print(id(root))
print(id(root.left))
print(id(root.right))
它们都有相同的值。两个版本都打印左
。您混淆了类定义和类实例化。如果要实例化一个类,您绝对需要括号root.left=Tree
与root.left=Tree()
不同。如果您只有树
,那么您是在引用类本身,而不是实例化它。