javascript - 我可以复制简单的对象结构并将 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]
选择符号。
这可能看起来没什么大不了的,但在整个大型项目中,当您希望数据结构尽可能简化时,更简单的对象结构是不错的选择。那我是不是误会了?有人请澄清
解决方案
也许你正在寻找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
?为什么方括号语法如此重要?这似乎是主观的。
推荐阅读
- vba - 创建数据透视表的 VBA 代码适用于 Excel 365 [Mac],但不适用于 Excel Professional Pro Suite [PC]
- sql-server - 用具有数据子集的表副本替换,而不是从表中删除 - 最佳方法
- c# - 如果第一个元素始终相同,则解析文本文件连接字符串
- angular - Angular Material 6 中的 CustomeDateAdapter
- python - 通过 Multiindex Pandas DataFrame 迭代以按特定索引级别进行规范化
- javascript - Cookie .js 不适用于子域 - 是代码吗?德鲁巴?阿奎亚?业力?
- java - Java 7中的Java领域结果排序?
- python - 安装 pandas 时 pip3 失败,错误代码 1 为 None
- javascript - 使用 Javascript 从 CosmosDB 收集 Azure Function 查询
- javascript - div 标签不会换行