2017-08-16 38 views
-2

我是OOP的新手,編寫需要很多(> = 9)默認「硬編碼」參數的類。如何在類中定義許多靜態(默認)參數python3

是什麼定義這些類中的正確方法嗎?

解決方案#1

class SomeCLass(): 
    __param1 = 'param1' 
    __param2 = 'param2' 
    __param3 = 'param3' 
    __param4 = 'param4' 

    def some_method(self): 
     return self.__param1 

或者我應該做這種方式

解決方案#2

class SomeCLass(): 

    def __init__(self, param1 = 'param1', param2 = 'param2', ...., 
       ...param8 = 'param'): 
     self.param1 = param1 

謝謝

+0

這兩件事情是不一樣的,你需要取決於你的具體環境。 – jonrsharpe

+2

您在第一個示例中使用* class attributes *。在第二個例子中,你的'__init__'功能有一堆的默認參數,這大概,你將設置爲*實例屬性*。這些是不同的情況。此外,不要使用雙下劃線名稱mangling,除非你明白它在做什麼,甚至可能不會... –

+0

另外,雖然類屬性類似於像java這樣的語言中的靜態成員,但它們並不是真的相當於默認參數。 –

回答

0

簡短的回答:溶液1將有名爲paramN的字段,所以lution 2將有構造函數的參數,但不包含類實例中的字段。

最簡單的方式做,這是證明它。我將改變你的課程名稱,以免它們衝突,爲了簡潔起見,我將把它們限制爲兩個參數。

class SomeClass1(): 
    param1 = 'param1' 
    param2 = 'param2' 

    def some_method(self): 
     return self.param1 

class SomeClass2(): 
    def __init__(self, param1 = 'param1', param2 = 'param2'): 
     pass 

    def some_method(self): 
     return self.param1 

# prints the string 'param1' 
one = SomeClass1() 
print(one.some_method()) 

# throws a NameError, 
# because SomeClass2 instances don't have the field 
two = SomeClass2() 
print(two.some_method()) 

如果你想SomeClass2有帕拉姆領域,你需要處理的是,在__init()__方法通過捕捉參數:

class SomeClass2(): 
    def __init__(self, param1 = 'param1', param2 = 'param2'): 
     self.param1 = param1 
     self.param2 = param2 

即使被警告,這些論據並不硬按照您的要求編碼爲

# Prints the integer 1, not the string 'param1' 
two = SomeClass2(param1 = 1, param2 = 2) 
print(two.some_method())  

至於哪一個是正確的,那麼取決於你想要做什麼。這兩個解決方案都是有效的Python代碼。