我正在尝试使用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'的属性覆盖。我在这里做错了什么和/或是否有一个我失踪的步骤?
答案 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的名称仍然报告不同。