Python中的多个构造函数

8 投票
5 回答
3489 浏览
提问于 2025-04-16 05:45

我有一个类A,可以通过两种不同的方式来创建。

  • a = A(路径到xml文件)
  • a = A(列表A, 列表B)

第一种方法是通过一个文件路径作为输入,从XML文件中解析出列表A和列表B。第二种方法则是直接给出两个列表。

我想到两种实现多个构造方法的方式。你觉得怎么样?通常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 个回答

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

对于第二种情况,使用 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
7

让构造函数接收这两个列表。写一个工厂类方法,用来解析XML并返回对象。

撰写回答