Python: 從外部可以修改私有屬性嗎? obj._Cult__name = “天堂之門” ; setattr( obj , “_Cult__name” , “大衛教派” )

加入好友
加入社群
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王

參考: 在外部修改私有屬性,真行嗎?

class Cult:
    def __init__(self,name):
        self.__name = name #私有屬性
   
    def getname(self):
        return self.__name
   
    def setname(self,name):
        self.__name = name
       
obj = Cult(“奧修教”)
print(“建立物件後的初值obj.getname():”, obj.getname())

obj.__name =”天堂之門”
print(“用obj.__name賦值:”, obj.__name)

setattr(obj,”__name”,”大衛教派”)
print(“使用setattr賦值:”, obj.__name)

print(“其實沒改成功, obj.getname():”, obj.getname())

obj.setname(“太陽聖殿教”)
print(“使用class中的setname才真的修改成功\nobj.getname():”,obj.getname())

Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王

輸出結果:
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王
既然直接用物件.屬性或setattr()的方式修改確定無效,
又為甚麼沒有報錯,而且賦值後
反而可以用物件.屬性印出__name的值呢?
 
Python內部對前綴但無後綴兩條底線的私有屬性/方法的內部實作,
是在原來的私有名稱的前面,自動加上class名稱,
再在class名稱前加一條底線(如果class名稱本身就有前綴底線則不加),
而構成一個新的屬性/方法名稱。
上例class是Cult,有一個private屬性__name
Python內部會將此屬性的名稱轉為_Cult__name
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王
走後門修改私有屬性
obj._Cult__name = “天堂之門”
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王
改用setattr 走後門
setattr(obj,”_Cult__name”,”大衛教派”)
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王

加入好友
加入社群
Python: 從外部可以修改私有屬性嗎? obj._Cult__name = "天堂之門" ; setattr( obj , "_Cult__name" , "大衛教派" ) - 儲蓄保險王

儲蓄保險王

儲蓄險是板主最喜愛的儲蓄工具,最喜愛的投資理財工具則是ETF,最喜愛的省錢工具則是信用卡

You may also like...

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *