首页 > 解决方案 > 我可以复制简单的对象结构并将 obj[prop] 选择符号与 Python 中的类一起使用吗?

问题描述

来自 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"
}

这与对象根本不同,因此它不会等同于从类创建的对象的版本。是的,您可以向该类添加魔术方法以使其行为相似,但不一样。

这就是我的问题所在,特别是:是否可以定义一个能够使用myObj1[prop3]getter 和 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]选择符号。

这可能看起来没什么大不了的,但在整个大型项目中,当您希望数据结构尽可能简化时,更简单的对象结构是不错的选择。那我是不是误会了?有人请澄清

标签: javascriptpython

解决方案


也许你正在寻找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"])

但是, just 有什么问题t.prop1?为什么方括号语法如此重要?这似乎是主观的。


推荐阅读