Python的多个构造函数

时间:2010-10-19 20:13:22

标签: python constructor

我有一个可以通过两种不同方式生成的A类。

  • a = A(path_to_xml_file)
  • a = A(listA,listB)

第一种方法有文件路径作为输入,从XML文件解析得到listA和listB。第二种方法有两个列表。

我可以想到两种方法来实现多个构造函数。你怎么看? Python家伙通常使用什么方法来处理这种情况?

检查类型

class A():
    def __init__(self, arg1, arg2 = None):
        if isinstance(arg1, str): 
            ...
        elif isinstance(arg1, list):
            ...

a = A("abc")
b = A([1,2,3],[4,5,6])

制作不同的构建者

class A2():
    def __init__(self):
        pass
    def genFromPath(self, path):
        ...
    def genFromList(self, list1, list2):
        ...
a = A2()
a.genFromPath("abc")
b = A2()
b.genFromList([1,2,3],[4,5,6])

5 个答案:

答案 0 :(得分:7)

使构造函数取两个列表。编写一个解析XML并返回对象的工厂类方法。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

由于传递给初始值设定项的参数数量在每种情况下都不同,因此可以使用扩展调用语法来避免类型检查:

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()

答案 3 :(得分:2)

更仔细地看一下这个问题,我建议让这个类有两个列表,并在模块中包含一个辅助函数:

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)

答案 4 :(得分:2)

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'])