2013-02-07 105 views
2

我想知道,如果方法和屬性在類中具有相同的名稱會發生​​什麼。程序是否會首先在對象中搜索屬性,並且如果類中的某個方法具有相同的名稱,程序是否會跳過它並只關注對象?方法和屬性

+0

這將是定義最新的 – Volatility

+0

一個簡單的方法來回答這個問題將是寫這樣一個類,看看會發生什麼。 –

+0

方法只是字符串,整數,列表等對象。你認爲的「方法」只是一個屬性引用的對象。 –

回答

1

這取決於首先分配哪一個。

如果該方法首先分配,屬性將是一個你將訪問,

例如

class Example(object): 
    def __init__(self): 
     self.x = 44 

    def x(self): 
     return "hi" 

print Example().x 

當類處理時,「分配」方法,其中as在初始化時被分配。這意味着x會覆蓋該方法。

這當然是用於類級不同的屬性,因爲它們是在同一時間指定爲方法

class Example(object): 
    x = 43 

    def x(self): 
     return "hi" 

print Example().x 

表明,該方法將覆蓋屬性。

+0

謝謝!但是你說x在初始化時被賦值,這意味着該方法被首先賦值,所以應該打印Example()。x return hi?因爲它被定義爲最新的? – John

+0

理解這一點的重要關鍵是Python中的函數/方法本身就是對象。創建一個方法從根本上爲一個屬性賦值;它恰好是一個可調用的值。一旦你有了這樣的理解,直接看到最後發生的任務「勝利」。 – GrandOpener

+0

「可以直接看到最後發生的任務」勝利「。」我理解你的意思,但是在上例中最後發生的任務,第一個是def x(self)...返回hi 。這就是爲什麼它應該打印出你好。因爲這是最新的定義。 – John

1

Jakob的答案大多準確但不完整。如果類中定義的x遵循描述符協議並且定義了__get____set__方法,那麼它將繼續優先於實例字典中的任何'x'。看到這種最簡單的方法是使用property

>>> class Example(object): 
    def __init__(self): 
     self.x = 44 

    @property 
    def x(self): 
     return "hi" 
    @x.setter 
    def x(self, value): 
     self.__dict__['x'] = value 


>>> Example().x 
'hi' 
>>> Example().__dict__['x'] 
44 

所以實際的規則就是,Python看起來類(和其基地),如果發現匹配的對象和對象有__get__方法(如果設置爲__set__),那麼它會調用__get__方法,否則它會查找實例屬性,並在使用該屬性時使用該屬性,或者如果不存在則返回使用類屬性(即方法)。

如果定義了__getattribute____getattr__,則查找可能會更加複雜。