Python 3.X中classname.attribute和self.attribute之间的区别是什么

时间:2018-01-11 00:54:48

标签: python python-3.x class

有两个代码如下:

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

但这两种方式有什么不同?

谢谢

2 个答案:

答案 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应该是默认行为。