從 JavaScript 背景來看,這看起來確實令人困惑并且不必要地復(fù)雜。但也許我誤解了/錯過了一些東西。我只想創(chuàng)建對象,為它們分配和選擇動態(tài)命名的屬性,然后打印出它們的結(jié)構(gòu),以便我可以確保結(jié)構(gòu)正確。但對于 Python 來說,我似乎需要對象中額外的結(jié)構(gòu)復(fù)雜性才能做到這一點。在 JavaScript 中,我可以像在 Python 中一樣創(chuàng)建一個類,或者直接定義它,并且在這兩種情況下對象都具有相同的簡單結(jié)構(gòu):class myObjClass { constructor() { this.prop1 = "val1" this.prop2 = "val2" }}// directly definedconst myObj1 = { prop1: "val1" prop2: "val2"}// defined from classmyObj2 = new myObjClass()// loggedconsole.log(myObj1) // { prop1: "val1", prop2: "val2" }console.log(myObj2) // { prop1: "val1", prop2: "val2" }// dynamically assigned toconst imagineThisNameIsDynamic = "prop3"myObj1[imagineThisNameIsDynamic] = "val3"myObj2[imagineThisNameIsDynamic] = "val3"// dynamically selected frommyObj1[imagineThisNameIsDynamic] // "val3"myObj2[imagineThisNameIsDynamic] // "val3"但在Python中,看起來像這樣做,你不能直接定義一個Object,只能定義一個Dictionary:const myObj1 = { prop1: "val1" prop2: "val2"}這與對象有根本的不同,因此它不會等同于從類創(chuàng)建的對象的版本。是的,您可以向類添加魔術(shù)方法,使其行為相似,但不相同。這就是我的問題所在,具體來說:是否可以定義一個能夠使用 gettermyObj1[prop3]和 setter 表示法而不必將數(shù)據(jù)存儲在子屬性中的類?根據(jù)我在文檔和教程中閱讀的內(nèi)容,要使對象能夠使用該表示法,您必須創(chuàng)建一個子屬性來設(shè)置/獲取以及傳入/傳出的數(shù)據(jù),如下所示:class myObjClass(object): def __init__(self): self.prop1 = "val1" self.prop2 = "val2" self.dict= {} def __getitem__(self, prop): return self.dict[prop] def __setitem__(self, prop, val): self.dict[prop] = val如果我必須這樣做,那么現(xiàn)在當我在項目中記錄對象的結(jié)構(gòu)時,我不能擁有像這樣的簡單結(jié)構(gòu):imagineThisNameIsDynamic = "prop3"myObj1 = myObjClass()myObj1[imagineThisNameIsDynamic] = "val3"myPrettyPrintFunc(myObj1) # { prop1: "val1", prop2: "val2", prop3: "val3" }相反,它就像:myPrettyPrintFunc(myObj1) # { prop1: "val1", prop2: "val2", dict: { prop3: "val3" } }除非我想使用本機函數(shù)setattr/getattr每次需要訪問/定義對象屬性時,我認為這會導(dǎo)致代碼可讀性較差/丑陋,所以我真的更喜歡選擇表示obj[prop]法。這可能看起來不是什么大問題,但在整個大型項目中,當您希望數(shù)據(jù)結(jié)構(gòu)盡可能簡化時,更簡單的對象結(jié)構(gòu)是很好的。那我是不是理解錯了?有人請澄清一下
我可以復(fù)制簡單的對象結(jié)構(gòu)并在 Python 中的類中使用 obj[prop] 選擇表示法嗎?
BIG陽
2023-08-18 17:00:24