2009-10-28 78 views
1

我是新手,很難在Python中掌握Class的語法。我有一個C/C++,Java和Objective C的背景。我注意到python的一個很大的區別是你沒有顯式聲明類中的「數據成員」,而只是隨機添加它們?這會導致相當大的混亂。請幫我理解Python中的類

讓說,我有一類

class MyClass: 

    def __int__(self, a, b): 

     self.a = a 

     self.b = b 

,然後當我發起的對象。

myobject = MyClass(10,10) 

而剛剛過了一段時間由於某種原因,我才知道我需要另一個參數在這個類,但我不希望啓動,使用構造,因爲它會被取決於一些特定條件的另一個功能啓動,所以在整個代碼中,只會指出變量實際上誕生了。是不是當我在調試時檢查代碼或檢查它的其他原因會造成混淆?

+3

你在這裏使用了很多單詞,我不確定你是否知道它的含義。什麼? – 2009-10-28 00:29:04

+0

@NSD可能就像我告訴我,我是非常新的python,可能不知道python行話。 – itsaboutcode 2009-10-28 00:33:11

+0

我認爲它更多的是一個語法建構的問題比較大的單詞 – Jimmy 2009-10-28 00:59:16

回答

2

你應該真的使用一些在你的文本:P

難道你的意思是:

class MyClass: 
    def __int__(self, a, b, c=None): 
     self.a = a 
     self.b = b 
     self.c = c 

one = MyClass(1,2) 
one.C# None 
two = MyClass(1,2,3) 
two.C# 3 
+0

它看起來是一個很好的解決方案,但如果有人因某種原因忘記將這個新領域分配給None,你不覺得它太容易是因爲什麼很多問題? – itsaboutcode 2009-10-28 00:35:38

+0

如果你不在'__init__'中寫'c = None',那麼你只能用3個參數創建對象。 – 2009-10-28 00:39:39

+1

我認爲這種說法是正確的,蟒蛇是成年人不爲孩子lox ... – itsaboutcode 2009-10-28 00:41:52

5

總之,

你說得對。 Python允許您隨時在對象中添加(並刪除!)成員。關於構造函數沒有什麼特別的,它允許它做其他函數不能做的任何事情。

如果您想確保您的類的所有實例始終具有相同的成員,那麼通過所有方法將它們全部在構造函數中分配,使用像None這樣的哨兵值來表示沒有任何意義的成員值,然後避免在構造函數之外添加新成員。

這取決於你如何操縱你的對象,如果你想以靜態的方式做到這一點,那很好,或者如果你想利用在任意時間添加和刪除成員的能力,那很好太。 Python本身並不強制(m)任何規則。

+0

但是你不覺得這個「太多」的自由會在大項目中造成很多問題嗎? – itsaboutcode 2009-10-28 00:36:49

+0

@itsaboutcode:是的,可以。這就是爲什麼Python允許你在任意時間*不添加任意成員,如果你選擇不這樣做。你可以制定自己的規則,並選擇堅持他們,或不。 – RichieHindle 2009-10-28 00:39:20

+0

你應該提到'hasattr'和姐妹 – hasen 2009-10-28 00:54:34

0
class MyClass: 
    def __int__(self, a, b): 
     self.a = a 
     self.b = b 
     self.c = None #This line is optional 

    def set_c(self, c): 
     self.c = c 

有些人更喜歡列出__init__中的所有屬性。您不需要,但是您可能會選擇多種原因。
也許它會提高編輯人員理解代碼以突出顯示或完成的能力。
也許這只是你喜歡的一種風格。