有两个代码如下:
class State:
country = "China"
def __init__(self):
print(State.country)
obj = State()
和
class State:
country = "China"
def __init__(self):
print(self.country)
obj = State()
他们都运作良好并有输出:
China
但这两种方式有什么不同?
谢谢
答案 0 :(得分:1)
本文详细介绍了此处发生的情况以及如何处理。
https://www.toptal.com/python/python-class-attributes-an-overly-thorough-guide
在这两种情况下,代码都在访问类属性State.country
。由于State
的每个实例都可以访问类属性,self.country
将返回与State.country
相同的值 - 除非您修改它。
如果您选择为State
的实例分配新值,则不会更新“实例的国家/地区属性”,因为该实例没有国家/地区属性。相反,它将为该特定实例创建一个名为country的实例属性,并且将来,当您调用实例的country属性(例如self.country
)时,Python解释器将找到实例属性第一个,但是class属性仍然存在;只要具有相同名称的实例属性仍然存在,解释器就永远不会找到它。
以下内容证明了这一点:
class State:
country = "China"
def __init__(self):
pass # The constructor is unnecessary for this example
s = State()
print(s.country) # Prints "China"
print(State.country) # Prints "China"
s.country = "Japan" # State.country still equals "China", but s.country has been
# created and initialized to "Japan"
print(s.country) # Prints "Japan"
print(State.country) # Prints "China"
new_s = State()
print(new_s.country) # Prints "China"
del s.country # Deletes the instance attribute country created for s
print(s.country) # Prints "China"; now that the instance attribute has been
# deleted, the Python interpreter will fail to find s.country
# within the instance namespace, and so it will search the
# class namespace and it will find the class attribute State.country
这一切都表明你应该研究Python约定,以保持类属性和实例属性不同,并且只在适当的场景中使用它们。
答案 1 :(得分:-2)
其类级别与实例级别访问权限。
当您执行State.country时,它会访问State
的所有实例的country属性但是当你做self.country时,它只会访问实例的country属性。
进行类级别修改将反映在从类创建的所有实例上,因此应该非常小心地使用它。 self应该是默认行为。