簡體   English   中英

用 getattr 修改屬性 - 有可能嗎?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM