2011-12-04 17 views
5

Mam dwóch konstruktorów w klasie:Konstruktor łańcuchowym w Pythonie

def __init__(self): 
    self(8) 

def __init__(self, size): 
    self.buffer = [1] * size 

gdzie chcę pierwszego konstruktora zadzwonić drugi z domyślnym rozmiarze. Czy jest to możliwe w python?

+3

Nie masz dwa konstruktory, drugi nadpisuje pierwszy. – u0b34a0f6ae

Odpowiedz

9

Nie można zdefiniować wiele inicjatorów w Pythonie (jak wskazano w uwagach, __init__is not really a constructor), ale można określić wartości domyślne, na przykład:

def __init__(self, size=8): 
    self.buffer = [1] * size 

W powyższym kodzie, bufor o wielkości 8 utworzone domyślnie, ale jeśli określono parametr wielkości, parametr zostanie użyty zamiast tego.

Załóżmy na przykład, że inicjalizator znajduje się w klasie o nazwie Example. Ta rozmowa będzie utworzyć nową instancję klasy z buforem o rozmiarze 8 (domyślnie):

e = Example() 

niniejsze wezwanie stworzy nową instancję z buforem o rozmiarze 10:

e = Example(10) 

Alternatywnie można również wywołać konstruktora w następujący sposób:

e = Example(size=10) 
+1

'__init__' nie jest konstruktorem, ale inicjatorem. Zobacz ['__init__' jako konstruktora?] (Http://stackoverflow.com/questions/6578487/init-as-a-constructor). – Nathan

+0

Dzięki za wskazanie tego, @Nathan. Odpowiednio zredagowałem swoją odpowiedź. –

5

Nie, nie można przeciążać metod w Pythonie. nie

def __init__(self, size=8): 
    self.buffer = [1] * size 
1

prawdopodobnie w ten sposób: w tym przypadku, można po prostu użyć wartości domyślnej dla parametru size zamiast. Klasy Python używają wewnętrznego słownika do przechowywania jego metody i właściwości, druga metoda o tej samej nazwie zastępuje pierwszą. Można przypisać wartość domyślną do dodatkowego parametru, aby to zrobić,

def __init__(self, size = 8): 
    self.buffer = [1] * size 
Powiązane problemy