參考: 在外部修改私有屬性,真行嗎?
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())

輸出結果:

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

改用setattr 走後門
setattr(obj,”_Cult__name”,”大衛教派”)

![Python 打造高容錯搜尋引擎:BM25、Bigram 與difflib自動糾錯實戰; from rank_bm25 import BM25Okapi ; bm25 = BM25Okapi(corpus_tokens) #corpus_tokens: list[list[str]] Python 打造高容錯搜尋引擎:BM25、Bigram 與difflib自動糾錯實戰; from rank_bm25 import BM25Okapi ; bm25 = BM25Okapi(corpus_tokens) #corpus_tokens: list[list[str]]](https://i2.wp.com/savingking.com.tw/wp-content/uploads/2026/02/20260209150527_0_a24c17.png?quality=90&zoom=2&ssl=1&resize=350%2C233)






![Python爬蟲:BeautifulSoup的 .find_all() 與 .find() 與 .select(‘標籤名[屬性名1=”屬性值1″][屬性名2=”屬性值2″]’) ; from bs4 import BeautifulSoup ; Live Server(可以預覽HTML的VS Code套件) Python爬蟲:BeautifulSoup的 .find_all() 與 .find() 與 .select(‘標籤名[屬性名1=”屬性值1″][屬性名2=”屬性值2″]’) ; from bs4 import BeautifulSoup ; Live Server(可以預覽HTML的VS Code套件)](https://i1.wp.com/savingking.com.tw/wp-content/uploads/2025/03/20250330190318_0_925655.jpg?quality=90&zoom=2&ssl=1&resize=350%2C233)


近期留言