从 JavaScript 背景来看,这看起来确实令人困惑并且不必要地复杂。但也许我误解了/错过了一些东西。我只想创建对象,为它们分配和选择动态命名的属性,然后打印出它们的结构,以便我可以确保结构正确。但对于 Python 来说,我似乎需要对象中额外的结构复杂性才能做到这一点。
在 JavaScript 中,我可以像在 Python 中一样创建一个类,或者直接定义它,并且在这两种情况下对象都具有相同的简单结构:
class myObjClass {
constructor() {
this.prop1 = "val1"
this.prop2 = "val2"
}
}
// directly defined
const myObj1 = {
prop1: "val1"
prop2: "val2"
}
// defined from class
myObj2 = new myObjClass()
// logged
console.log(myObj1) // { prop1: "val1", prop2: "val2" }
console.log(myObj2) // { prop1: "val1", prop2: "val2" }
// dynamically assigned to
const imagineThisNameIsDynamic = "prop3"
myObj1[imagineThisNameIsDynamic] = "val3"
myObj2[imagineThisNameIsDynamic] = "val3"
// dynamically selected from
myObj1[imagineThisNameIsDynamic] // "val3"
myObj2[imagineThisNameIsDynamic] // "val3"
但在Python中,看起来像这样做,你不能直接定义一个Object,只能定义一个Dictionary:
const myObj1 = {
prop1: "val1"
prop2: "val2"
}
这与对象有根本的不同,因此它不会等同于从类创建的对象的版本。是的,您可以向类添加魔术方法,使其行为相似,但不相同。
这就是我的问题所在,具体来说:是否可以定义一个能够使用 gettermyObj1[prop3]和 setter 表示法而不必将数据存储在子属性中的类?根据我在文档和教程中阅读的内容,要使对象能够使用该表示法,您必须创建一个子属性来设置/获取以及传入/传出的数据,如下所示:
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
如果我必须这样做,那么现在当我在项目中记录对象的结构时,我不能拥有像这样的简单结构:
imagineThisNameIsDynamic = "prop3"
myObj1 = myObjClass()
myObj1[imagineThisNameIsDynamic] = "val3"
myPrettyPrintFunc(myObj1) # { prop1: "val1", prop2: "val2", prop3: "val3" }
相反,它就像:
myPrettyPrintFunc(myObj1) # { prop1: "val1", prop2: "val2", dict: { prop3: "val3" } }
除非我想使用本机函数setattr/getattr每次需要访问/定义对象属性时,我认为这会导致代码可读性较差/丑陋,所以我真的更喜欢选择表示obj[prop]法。
这可能看起来不是什么大问题,但在整个大型项目中,当您希望数据结构尽可能简化时,更简单的对象结构是很好的。那我是不是理解错了?有人请澄清一下
LEATH
相关分类