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()
不同。如果您只有
,那么您是在引用类本身,而不是实例化它。