2012-04-23 137 views
1

當我在python中編寫類時,大多數時候,我渴望將我使用的變量設置爲對象的屬性。是否有關於哪些變量應該用作類/實例屬性以及哪些不應該的規則或一般準則?python中的類,如何設置屬性

例如:

class simple(object): 
    def __init(self): 
     a=2 
     b=3 
     return a*b 

class simple(object): 
    def __init(self): 
     self.a=2 
     self.b=3 
     return a*b 

雖然我完全理解的屬性應該是對象的屬性。當類聲明很簡單時,這很容易理解,但隨着程序變得越來越長,並且有很多地方需要在各個模塊之間進行數據交換,我對使用a/b或self.a的位置感到困惑。 /self.b。有沒有任何指導方針?

+1

那些'__init'不應該是'__init__'嗎? – ricochet1k 2012-04-23 19:35:38

+1

我真正喜歡的經驗法則是:使用最小範圍,你可以逃脫。局部變量的範圍比屬性小得多,因此如果你沒有一個令人信服的用例作爲屬性...... – delnan 2012-04-23 19:38:46

+0

@delnan:不錯的建議 – 2012-04-23 20:12:22

回答

5

您在哪裏使用self.a您正在創建一個屬性,因此可以從課程外部訪問此屬性並保持該功能。這些應該用於存儲關於對象的數據。

你在哪裏使用a它是一個局部變量,只能在該函數的作用域內持續,所以應該在你只在函數內使用它的地方使用(在這種情況下)。

請注意__init是誤導,因爲它看起來像__init__ - 但不是構造函數。如果你希望他們是構造函數,那麼返回一個值是沒有意義的(因爲新對象是返回的)。

+0

__init__Typo ...我的問題依然存在。我很難決定自己何時創建/不創建財產。我有時認爲同樣的事情可以在班級之外使用,並傾向於使用它。在確定是否將它用作self.a或a時,我沒有某種決定性的作用。這是我的問題。 – 2012-04-23 20:15:05

+0

@Jack_of_All_Trades正如我在我的問題中所說的那樣,這僅僅是內部唯一相關的情況嗎?如果是這樣,請使用局部變量,否則使其成爲屬性。儘量使用盡可能小的範圍來保持代碼清潔,並且記住,你總是可以回去改變它,這不是什麼大不了的事情。 – 2012-04-23 22:19:30

1

我嘗試想象我希望我的類的API在實現它之前看起來像什麼。我想我自己,如果我沒有寫這個類,我是否想閱讀關於這個特定變量的文檔?如果閱讀文檔會浪費我的時間,那麼它應該是一個局部變量。

有時候,您需要保留一些信息,但您不一定希望它成爲API的一部分,也就是您使用附加下劃線的約定。例如self._some_data_that_is_not_part_of_the_api

1

自身參數是指對象本身。因此,如果您需要在類外部使用類屬性,則可以將其稱爲類實例的名稱和屬性名稱。我不認爲有什麼時候使用自己的指南,這一切都取決於你的需要。當你建立一個班級時,你應該嘗試考慮你將使用你創建的變量。如果你確實知道你將在程序中需要該特定屬性,那麼你需要添加self。

1
class Person(object): 
    def __init__(self, name): 
     # Introduce all instance variables on __init__ 
     self.name = name 
     self.another = None 

    def get_name(self): 
     # get_name has access to the `instance` variable 'name' 
     return self.name 

所以,如果你想有一個變量可用一個以上的方法,使 它的instance變量。

請注意我在__init__上引入所有實例變量的評論。 雖然下面的例子是有效的python不要這樣做。

class Person(object): 
    def __init__(self): 
     self.a = 0 
    def foo(self): 
     self.b = 1 # Whoa, introduced new instance variable 

相反初始化上__init__所有實例變量和設置 他們None如果沒有其他價值是適合他們。