Python 中的静态 class 变量 -- 列表和对象
Static class variables in Python -- Lists & Objects
我是 Python 的新手,具有更多 Java 背景。我了解 Python 中静态 class 变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如 - 它们在以下实例之间共享class.
换句话说:
class box ():
name = ''
contents = []
def __init__ (self, name):
self.name = name
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents
现在,如果我创建两个实例并尝试向它们添加内容:
a = box('Box A')
b = box('Box B')
a.store('apple')
b.store('berry')
print a.open()
print b.open()
输出:
['apple','berry']
['apple','berry']
很明显它们在 box 的两个实例之间共享。
现在我可以通过执行以下操作来绕过它:
def store (self, junk):
temp = self.contents
temp.append(junk)
self.contents = temp
但是有cleaner/more常规方法吗?有人可以解释为什么会这样吗?
在您的案例中,这两个变量都是 class 个变量。但是,您为对象 A 和 B 设置了不同的字符串,实际上您是在再次初始化它们。另一方面,列表不会再次初始化,因此对象 A 和 B 的列表都指向内存中的同一个对象。因此,追加项目会将项目追加到内存中的同一列表。因此,结果。
你要这样写:
class box ():
def __init__ (self, name):
self.name = name
self.contents = []
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents
关键字self
使它们独立,就好像你在说self.name,属于box()
的当前实例class:
class box ():
def __init__ (self, name):
self.name = name
self.contents = []
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents
我是 Python 的新手,具有更多 Java 背景。我了解 Python 中静态 class 变量的概念,但我注意到列表和对象的工作方式与字符串不同,例如 - 它们在以下实例之间共享class.
换句话说:
class box ():
name = ''
contents = []
def __init__ (self, name):
self.name = name
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents
现在,如果我创建两个实例并尝试向它们添加内容:
a = box('Box A')
b = box('Box B')
a.store('apple')
b.store('berry')
print a.open()
print b.open()
输出:
['apple','berry']
['apple','berry']
很明显它们在 box 的两个实例之间共享。
现在我可以通过执行以下操作来绕过它:
def store (self, junk):
temp = self.contents
temp.append(junk)
self.contents = temp
但是有cleaner/more常规方法吗?有人可以解释为什么会这样吗?
在您的案例中,这两个变量都是 class 个变量。但是,您为对象 A 和 B 设置了不同的字符串,实际上您是在再次初始化它们。另一方面,列表不会再次初始化,因此对象 A 和 B 的列表都指向内存中的同一个对象。因此,追加项目会将项目追加到内存中的同一列表。因此,结果。
你要这样写:
class box ():
def __init__ (self, name):
self.name = name
self.contents = []
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents
关键字self
使它们独立,就好像你在说self.name,属于box()
的当前实例class:
class box ():
def __init__ (self, name):
self.name = name
self.contents = []
def store (self, junk):
self.contents.append(junk)
def open (self):
return self.contents