在一個類中不能有兩個構造函數。
構造函數必須命名爲__init__
。而且,與Java不同,Python不允許通過它們的參數類型來重載函數或方法。所以,如果你有兩個構造函數,它們都是相同的函數。
有幾種解決方法。
使用@classmethod
S作爲替代構造:
class Breakfast(object):
@classmethod
def from_eggs(cls, eggs):
obj = cls()
obj.spam, obj.eggs = 5, eggs
return obj
@classmethod
def from_spam_and_eggs(cls, spam, eggs):
obj = cls()
obj.spam, obj.eggs = spam, eggs
return obj
從標準庫一個簡單的例子是datetime.datetime
,其可與now
構成,fromtimestamp
,或一些其他的替代構造,除了default 。
使用默認值,關鍵詞只,和/或可變參數的參數,使一個構造函數,可以調用不同的方式:
class Breakfast(object):
def __init__(self, eggs=0, spam=5):
self.spam, self.eggs = spam, eggs
int
就是這樣一個例子:你可以從一個字符串和一個基地,或從一個知道如何將其自身轉換爲一個整數的參數創建它。
創建子類,每個都有不同的構造函數:
class Breakfast(object):
pass
class HealthyBreakfast(object):
def __init__(self, spam):
self.spam, self.eggs = spam, 0
class NormalBreakfast(object):
def __init__(self, spam, eggs):
self.spam, self.eggs = spam, eggs
在任何情況下,你可以分解出共性成一個單一的「基地」初始化。例如:
class Breakfast(object):
def __init__(self, eggs, spam):
self.spam, self.eggs = spam, eggs
class HealthyBreakfast(object):
def __init__(self, spam):
super(HealthyBreakfast, self).__init__(0, spam)
當然在任何情況下,纔有可能吃早餐無垃圾郵件。
你可以有子類構造函數調用超構造函數通過'超'http://stackoverflow.com/questions/576169/understanding-python-super-and-init-methods –
謝謝你的答案。事情是,調用超級,我只有一個構造函數。 如果參數的數量(和/或類型)不同,則Java中可能有多個參數。我想知道python中是否存在相同的東西。 –
您可以使用'@ classmethod'來創建任意數量的構造函數。 – roippi