正如我在评论中指出的,class.var1是一个共享变量。如果不使用__init__中的非共享变量擦除它,则每个实例都可以将其访问为self.var1。以下是发生的情况的示例:
在功能和幕后发生的事情方面有什么区别吗
class Class:
def __init__(self, var1):
self.var1 = var1
和
class Class:
var1 = ""
def __init__(self, var1):
self.var1 = var1
在Python中?
让我们来探究一下。这是你的班级:
class Class:
var1 = 'in class'
def __init__(self, var1):
self.var1 = var1
c = Class('in inst')
访问c.var1
显示实例中的var1
:
>>> c.var1
'in inst'
位于c
:的__dict__
内部
>>> c.__dict__
{'var1': 'in inst'}
类变量var1
在Class
:的__dict__
中
>>> Class.__dict__['var1']
'in class'
现在创建一个只有类变量的类:
class Class2:
var1 = 'in class'
c2 = Class2()
由于实例中没有任何内容,将使用类中的var1
:
>>> c2.var1
'in class'
c2
的__dict__
为空:
>>> c2.__dict__
{}
Python总是先在实例中查找var1
,然后再返回到类中。
class Test(object):
shared = 0
def __init__(self, i):
self.notshared = i
def intro(self):
print("Shared is " + str(self.shared))
print("NotShared is " + str(self.notshared))
test1 = Test(4)
test1.intro()
# Shared is 0
# NotShared is 4
Test.shared = 5
test1.intro()
# Shared is 5
# NotShared is 4
test2 = Test(3)
test2.intro()
# Shared is 5
# NotShared is 3
但是,请注意,如果之后编写self.shared
变量,则不再使用self.shared
访问共享变量:
test1.shared = 12
test1.intro()
# Shared is 12
# NotShared is 4
test2.intro()
# Shared is 5
# NotShared is 3