我可以复制简单的对象结构并在 Python 中的类中使用 obj[prop] 选择表示法吗?

从 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]法。


这可能看起来不是什么大问题,但在整个大型项目中,当您希望数据结构尽可能简化时,更简单的对象结构是很好的。那我是不是理解错了?有人请澄清一下


BIG阳
浏览 64回答 1
1回答

LEATH

也许您正在寻找getattr?class Thing:    def __init__(self):        self.prop1 = "val1"        self.prop2 = "val2"    def __getitem__(self, prop):        return getattr(self, prop)t = Thing()print(t["prop1"])但是,仅仅有什么问题呢t.prop1?为什么方括号语法如此重要?看起来很主观。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript