代码之家  ›  专栏  ›  技术社区  ›  prosseek

使用Python的多构造函数

  •  8
  • prosseek  · 技术社区  · 14 年前

    • a=a(指向xml文件的路径)

    第一个方法使用文件路径作为输入,从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 回复  |  直到 14 年前
        1
  •  7
  •   Ignacio Vazquez-Abrams    14 年前

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

        2
  •  3
  •   petraszd    14 年前

    使用 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
    
        3
  •  3
  •   Ray    14 年前

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

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

        4
  •  2
  •   Chris B.    14 年前

    仔细观察这个问题,我建议让这个类获取两个列表,并在模块中包含一个helper函数:

    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)
    
        5
  •  2
  •   Dantalion    14 年前
    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'])