Python Class Variable 中的行為

Sample Code BEGIN
class A(object):
    var1='var1'
    def __init__(self):
        var2='var2'
            A.init_cls()
    @classmethod
    def init_cls(cls):
      cls.var3='var3'

x = A()
>>> A.var1 = 'A' # 將 class variable var1 設成 'A'

>>> A.var1
A
>>> x.var1
A
>>> x.var1 = 'x' # 將 class variable var1 設成 'x'

>>> x.var1
x
>>> A.var1
A

這邊就發生了神奇的事,為什麼 x.var1='x' 把var1設成 x 後,照理說 A.var1 應該會連動地也印出x,他們不是 class variable嗎?
因為 x.var1 = 'x' 的動作不是將 class variable var1 設成 'x' ,而是把 var1 re-bound 到 x object 的 namespace 下,而變成 x 的 attribute ,也就是 instance variable。

A 的 data attribute 叫 class variable
x 的 data attribute 叫 instance variable
根據 http://docs.python.org/2/tutorial/classes.html 官網的廣義定義,
任何 xxx.yyy 的形式,都要稱 yyy 是 xxx namespace 的 attributes。

在 x.var1 = 'x' 發生前
class A namespace 有 { var1='A', var3 } 是 class variable ,可以用 cls 或 A 來呼叫。
object x namespace 有 { var2 } 是 instance variable ,可以用 self 或 x 來呼叫。
x.var1 因為自己家裡沒找到 var1, 就理所當然地去抓 A.var1,印出 'A'。

當 x.var1 = 'x' 發生後
class A namespace 有 { var1='A', var3 } 是 class variable ,可以用 cls 或 A 來呼叫。
object x namespace 有 { var1='x', var2 } 是 instance variable ,可以用 self 或 x 來呼叫。
x.var1 因為家裡有 var1,就印出 'x'。

所以 initial object variable 時,為什麼要在 def init(self) 中,一個一個用 self.xxx = xxx ,就是要把 attributes 綁定到 self 的 namespace 下!

Refs:

http://stackoverflow.com/questions/68645/static-class-variables-in-python

comments powered by Disqus