Python的多重构造函数
我有一个可以通过两种不同方式生成的类aPython的多重构造函数,python,constructor,Python,Constructor,我有一个可以通过两种不同方式生成的类a a=a(指向xml文件的路径) a=a(列表a、列表B) 第一个方法将文件路径作为输入,从XML文件解析以获取listA和listB。第二种方法给出了两个列表 我可以想出两种方法来实现多个构造函数。你怎么认为?对于这种情况,Python人员通常使用什么方法 检查类型 制造不同的建设者 让构造函数获取这两个列表。编写一个factory classmethod,解析XML并返回对象。更仔细地看问题,我建议让类包含两个列表,并在模块中包含一个帮助函数: cl
- a=a(指向xml文件的路径)
- a=a(列表a、列表B)
让构造函数获取这两个列表。编写一个factory classmethod,解析XML并返回对象。更仔细地看问题,我建议让类包含两个列表,并在模块中包含一个帮助函数:
class A(object):
def __init__(self, list1, list2):
# Init from lists here
pass
def create_A_from_path(path):
list1, list2 = parse_xml_into_lists(path)
return A(list1, list2)
第二种方法使用
classmethod
class A(object):
@classmethod
def from_string(cls, string):
# ...
@classmethod
def from_lists(cls, list1, list2):
# ...
使用模块的函数
def from_string(string):
# ...
def from_lists(list1, list2):
# ...
class A(object):
pass
由于传递给初始值设定项的参数数量在每种情况下都不同,因此可以使用扩展调用语法避免类型检查:
class A(object):
def __init__(self, *args):
if len(args) == 1:
path = args[0]
...
elif len(args) == 2:
list1 = args[0]
list2 = args[1]
...
else:
raise SomeException()
请注意,这并不是一个好方法,因为它违背了Python通常的自文档性质。为什么classmethod优于staticmethod?@Peter:因此,如果类是从中派生的,则该方法将选择适当的类进行实例化。为什么不对称?也就是说,为什么不使用两个工厂类方法,一个用于XML,一个用于一对列表?或者是因为您假设“列表对”是构建此对象的“自然”方式,因此factory方法可以依赖“列表对”构造函数?@max:
list
是本机Python类型。XML不是。
def from_string(string):
# ...
def from_lists(list1, list2):
# ...
class A(object):
pass
class A(object):
def __init__(self, *args):
if len(args) == 1:
path = args[0]
...
elif len(args) == 2:
list1 = args[0]
list2 = args[1]
...
else:
raise SomeException()
class A(object):
@staticmethod
def from_string(str):
obj =A()
obj.str = str
return obj
@staticmethod
def from_list(lis):
obj = A()
obj.lis = lis
return obj
>>>
(obj1, obj2) = A.from_string('hello'), A.from_list(['one', 'two'])