gpt4 book ai didi

Python 使用 kwargs 初始化对象

转载 作者:太空宇宙 更新时间:2023-11-04 01:20:47 25 4
gpt4 key购买 nike

我正在尝试使用 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”的属性覆盖。我在这里做错了什么和/或我错过了什么步骤吗?

最佳答案

您是正确的,使用 **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 的名称仍然报告为不同。

关于Python 使用 kwargs 初始化对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21406915/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com