Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python的多重构造函数_Python_Constructor - Fatal编程技术网

Python的多重构造函数

Python的多重构造函数,python,constructor,Python,Constructor,我有一个可以通过两种不同方式生成的类a a=a(指向xml文件的路径) a=a(列表a、列表B) 第一个方法将文件路径作为输入,从XML文件解析以获取listA和listB。第二种方法给出了两个列表 我可以想出两种方法来实现多个构造函数。你怎么认为?对于这种情况,Python人员通常使用什么方法 检查类型 制造不同的建设者 让构造函数获取这两个列表。编写一个factory classmethod,解析XML并返回对象。更仔细地看问题,我建议让类包含两个列表,并在模块中包含一个帮助函数: cl

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

  • a=a(指向xml文件的路径)
  • a=a(列表a、列表B)
第一个方法将文件路径作为输入,从XML文件解析以获取listA和listB。第二种方法给出了两个列表

我可以想出两种方法来实现多个构造函数。你怎么认为?对于这种情况,Python人员通常使用什么方法

检查类型 制造不同的建设者
让构造函数获取这两个列表。编写一个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'])