一个类中不能有两个构造函数。
构造函数必须命名__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)
当然,在任何情况下都不可能在没有垃圾邮件的情况下享用早餐。