[英]modify attribute with getattr - is it possible?
假设我有一个具有三个属性的类:
class Human:
name = 'Thomas'
age = 15
robot = False
我知道我可以使用 .attribute 访问属性:
h = Human()
h.name # Thomas
h.age # 15
h.robot # False
但是出于某些目的,我想以通用方式修改属性:
def modify_attribute(object, attribute, new_value):
object.attribute = new_value
但是如果我给modify_attribute(h, name, 'Juliette')
或modify_attribute(h, 'name', 'Juliette')
python 将无法理解。 在后一种情况下,它会编译,但不会更改名称。
我阅读了有关getattr()
的内容,并认为我可以摆脱getattr(h, 'name') = 'Juliette'
但看来这不是一个有效的表达式。 (我试过这个是因为help(getattr)
说getattr(x, 'y')
相当于xy
)
谢谢您的帮助 !
回答您的具体问题:不,您不能使用getattr
替换属性(这是您的示例试图做的)。 您可以使用它来获取一个属性,如果该属性是可变的,则可以对其进行修改。
感谢@Scott Hunter和@Richard Neumann在评论部分解决了这个问题。
如果要设置,而不是获取属性,请使用
setattr()
:setattr(object, attribute, new_value)
如上所述,您可以通过使用 setattr 来实现此目的。 我会给出一个示例代码
>> class Person: ...
>> setattr(Person, 'age', 10)
>> print(Person.age)
10
但是,这将违反 OOP 中的原则,因为您必须了解有关对象的太多细节,以确保在设置新属性后不会破坏对象的内部行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.