为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

BIG阳 2023-08-18 17:00:24
从 JavaScript 背景来看,这看起来确实令人困惑并且不必要地复杂。但也许我误解了/错过了一些东西。我只想创建对象,为它们分配和选择动态命名的属性,然后打印出它们的结构,以便我可以确保结构正确。但对于 Python 来说,我似乎需要对象中额外的结构复杂性才能做到这一点。在 JavaScript 中,我可以像在 Python 中一样创建一个类,或者直接定义它,并且在这两种情况下对象都具有相同的简单结构: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"}这与对象有根本的不同,因此它不会等同于从类创建的对象的版本。是的,您可以向类添加魔术方法,使其行为相似,但不相同。这就是我的问题所在,具体来说:是否可以定义一个能够使用 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]法。这可能看起来不是什么大问题,但在整个大型项目中,当您希望数据结构尽可能简化时,更简单的对象结构是很好的。那我是不是理解错了?有人请澄清一下
查看完整描述

1 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

也许您正在寻找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?为什么方括号语法如此重要?看起来很主观。


查看完整回答
反对 回复 2023-08-18
  • 1 回答
  • 0 关注
  • 59 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信