Python中如何实现两个对象间同名属性的批量赋值?
def copy_attr(src, dest, lst):
for x in lst:
setattr(dest, x, getattr(src, x))
a = A()
b = B()
a.x = b.x
a.y = b.y
a.z = b.z
lst = [“x”, “y”, “z”]
copy_attr(a, b, lst)
函数作用, 将 8,9,10 行的代码 写成 12, 13 行的样子.
Python中如何实现两个对象间同名属性的批量赋值?
所以, 你的异常呢?
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
class Employee:
def __init__(self, name=None, age=None, city=None, salary=None):
self.name = name
self.age = age
self.city = city
self.salary = salary
def copy_matching_attrs(source, target):
"""
将source对象中与target对象同名的属性值复制到target对象
"""
# 获取target对象的所有实例属性名
target_attrs = set(vars(target).keys())
# 遍历source对象的属性
for attr_name in vars(source):
if attr_name in target_attrs:
setattr(target, attr_name, getattr(source, attr_name))
# 使用示例
person = Person("张三", 30, "北京")
employee = Employee(salary=50000)
print("复制前:")
print(f"person: {person.name}, {person.age}, {person.city}")
print(f"employee: {employee.name}, {employee.age}, {employee.city}, {employee.salary}")
copy_matching_attrs(person, employee)
print("\n复制后:")
print(f"person: {person.name}, {person.age}, {person.city}")
print(f"employee: {employee.name}, {employee.age}, {employee.city}, {employee.salary}")
# 输出:
# 复制前:
# person: 张三, 30, 北京
# employee: None, None, None, 50000
# 复制后:
# person: 张三, 30, 北京
# employee: 张三, 30, 北京, 50000
这个copy_matching_attrs函数通过vars()获取对象的属性字典,然后遍历源对象的属性,如果属性名在目标对象中也存在,就用setattr()进行赋值。注意它只复制实例属性,不处理类属性。
如果两个类结构相似,也可以考虑用__dict__.update()的方式:
def copy_matching_attrs_v2(source, target):
target.__dict__.update(
(k, v) for k, v in source.__dict__.items()
if k in target.__dict__
)
用setattr更安全些,能正确处理属性描述符等特殊情况。
总结:用vars()加setattr()批量处理同名属性。
没懂你意思, 那个函数就 3 行代码, 出异常也就只有 no field “y” in a object 对象这种, 还需要对异常进行什么处理吗?
就是 Python 的反射写了个循环…为什么要分享
谢谢楼主不辞辛苦从火星赶来告诉大家大清亡了。
对于现在的你们来说, 什么东西值得分享? 什么东西不值得分享?
zan
确实没有什么值得分享的了,我们到这里来只是为了扯蛋的:-)。
碰到问题,我会直接去看 python 源码
https://github.com/python/cpython
推荐你看看这个
https://github.com/jobbole/awesome-python-cn
你有什么自己写的东西超出这个范围的可以分享一下。
谢谢你的链接, 只是这种海量的资料总是让我感到迷茫. 我也不会 C 语言, 我只是来这论坛泡一泡, 前几天刚注册的账号
多泡一泡在说吧,在 V2EX 想 B 是很难的,因为都是高水平的喷子。

