[英]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.