2014-02-22 76 views
0

我一直在努力理解類和麪向對象。我看過herehere,但我認爲我的問題更基本。我的理解是,在程序代碼中,最好將變量傳遞給函數,並將其添加到本地名稱空間,而不是訪問全局變量(應該明確聲明)。但是我看到很多引用,其中類方法直接引用實例屬性。例如:Python - 應該將類屬性作爲局部變量傳遞給類方法嗎?

#procedural approach with local namespace 
a = 5 
def my_local_func(a): 
    return a + 1 

#procedural approach with global variable 
a = 5 
def my_global_func(): 
    global a 
    return a + 1 

#but it doesn't seem necessary in examples about classes 
class MyClass(object): 
    def __init__(self): 
     self.a = 5 

    def dosomething(self): 
     return self.a + 1 

在我看來,這個類的命名空間就是全局命名空間的一個子集,所以它不是很清楚,我爲什麼規則或在這種情況下,至少慣例的變化。我真正關心的是使用通過實例的屬性創建通過屬性裝飾更復雜的實例屬性:

class MyClass(object): 
    def __init__(self) 
     self.a = 5 
     self.b = 1 

    @property 
    def c(self):  
    return self.a + self.b 

    @c.setter 
    def c(self, value): 
     self.b = value 
     return self.a + self.b 

其實,現在我想想,我傳遞的整個自我對象的方法。因此,在那種情況下,對象將被複制到方法(本地)名稱空間中,就像它的屬性一樣,它恰好與實例名稱空間中的屬性具有相同的名稱。我會很感激反饋,讓我知道如果我正在考慮這個問題....我不能是唯一一個想知道這件事的人。

+2

沒有什麼只是「發生」具有相同的名稱:這是'self'通過的全部原因。但我不確定你在問什麼。 (也''自己'不復制,它通過引用傳遞) –

+0

@David:謝謝。這很有幫助。在我一直在努力的書中,基本上只是說,不要忘記在類方法中添加自己作爲必需的參數,而沒有真正談論爲什麼。所以我認爲類方法指向實例名稱空間中的引用,而不是引用方法局部名稱空間。這爲我清除它。 –

回答

0

好的,我現在明白了。感謝大衛的評論。

在這本書中,我一直在閱讀類,它說類方法需要自己添加,但它不能解釋爲什麼。當我在引用self.a或self.b的方法中看到引用時,我認爲它直接引用了實例名稱空間,因爲我沒有想過將一個名爲self的對象傳遞給該方法的含義。因此,對象的引用被傳遞到本地名稱空間,並且該方法創建本地引用,這與全局名稱空間中的函數行爲一致。

只是問這個問題很有幫助 - 對不起,如果我浪費了任何人的時間閱讀它。

相關問題