构造函数必须命名__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
或一些其他的替代构造,除了默认。
使用默认值,仅关键字和/或变量参数的参数来制作一个可以以不同方式调用的构造函数:
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)