Python用kwargs初始化对象

时间:2014-01-28 13:29:56

标签: python object attributes kwargs

我正在尝试使用kwargs初始化对象并使用以下代码:

class A:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        return "A('%s', '%s', '%s')" % (self.name, self.age, self.address)


a = A(name="J Smith", age=20, address ="New York")
b = A(name="B Jones", age=40, address = "Chicago")

我目前使用这种方法的问题是,使用kwargs而不是单独更新变量(即a.name =“J Smith”,a.age = 20)而不是将它们作为字典传递似乎要慢得多。在我初始化'b'之后,我发现实例'a'的属性已被'b'的属性覆盖。我在这里做错了什么和/或是否有一个我失踪的步骤?

1 个答案:

答案 0 :(得分:2)

你是正确的,使用** kwargs更新类几乎是手动设置每个变量的两倍。但是,两个单独的类对象相互覆盖应该没有问题。参考:

import timeit

class A:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)

class B:
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)

class C:
    def __init__(self, name, age):
        self.name = name
        self.age = age

def initialize_class_a():
    a = A(name="J Smith", age=20)
    b = A(name="B Jones", age=40)
    return a.name, b.name

def initialise_class_b():
    a = B(name="J Smith", age=20)
    b = B(name="B Jones", age=40)
    return a.name, b.name

def initialise_class_c():
    a = C(name="J Smith", age=20)
    b = C(name="B Jones", age=40)
    return a.name, b.name

print(initialize_class_a())
# ('J Smith', 'B Jones')
print(initialise_class_b())
# ('J Smith', 'B Jones')
print(initialise_class_c())
# ('J Smith', 'B Jones')

print(timeit.timeit("initialize_class_a()", "from __main__ import initialize_class_a"))
# 1.93
print(timeit.timeit("initialise_class_b()", "from __main__ import initialise_class_b"))
# 2.19
print(timeit.timeit("initialise_class_c()", "from __main__ import initialise_class_c"))
# 1.03

请注意,在每次运行中,两个单独的类对象a.name和b.name的名称仍然报告不同。