在Python中调用cls对象的构造函数

时间:2016-08-24 06:36:58

标签: python

我试图在python中调用class对象的构造函数。我设法使用以下几行来实现它:

obj = cls.__new__(cls)
n = (List of attribute names)
v = (List of attribute values)

for s in n:
    setattr(obj, s, v[s])

我想知道是否有办法直接将属性值+名称对插入构造函数中,因为如果我调用以下内容,则会忽略参数:

obj = cls.__new__(cls, v)

p.s。:我正在使用python3

该类与此类似:

class InheritingClass(BaseClass):
    def __init__(self, basic_attribute, another_attribute=None):
        super().__init__(basic_attribute=basic_attribute)
        self.another_attribute= another_attribute

class BaseClass:
    def __init__(self, basic_attribute=1):
       self.basic_attribute= basic_attribute

那里没什么特别的

3 个答案:

答案 0 :(得分:0)

__init__是Python类的构造函数,而不是__new__。有关详细信息,请参阅Pythons use of new and init

答案 1 :(得分:0)

要添加,如果您想将任意属性存储到您的班级,您可以使用dict.update,如下所示:

class BaseClass:
    def __init__(self, basic_attribute=1, **kw):
        self.basic_attribute = basic_attribute
        self.__dict__.update(**kw)


class InheritingClass(BaseClass):
    def __init__(self, basic_attribute, another_attribute=None, **kw):
        super().__init__(basic_attribute=basic_attribute, **kw)
        self.another_attribute = another_attribute

然后:

ic = InheritingClass('hi', a=1, b=20)
print(ic.a, ic.b)  # prints 1, 20

答案 2 :(得分:0)

  

我想知道是否有一种方法可以直接将属性值+名称对插入构造函数中

请不要那样做。这将是反模式。而是使用__init__方法来设置值。 __new__方法应该是返回对象实例obj的内存空间分配。

因此,您最好在__init__内执行此操作:

k = ['a', 'b', 'c']
v = [1, 2, 3]
d = dict(zip(k, v))

class C:
    def __init__(self, d):                
        for _ in d:            
            setattr(self, _, d[_])

ci=C(d)
print(ci.a) # 1

我使用dict作为__init__参数,在这里我使用zip方法创建一个。