问题标签 [setattr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - 在 python3 类中使用 __setattr__ + __slots__
我试图在自定义类层次结构中使用子元素属性访问。我的幻想在于我可以成功地使用描述符来做到这一点。我想更花哨,让类RefHolder
(在下面的测试用例中显示)使用插槽来节省空间。
但是,当我尝试使用插槽时,我得到了RuntimeError: maximum recursion depth exceeded
请注意,我已经尝试查看现有的解决方案,我能找到的最匹配的是这个:
https://stackoverflow.com/a/19566973/1671693
我已经在下面的测试用例中尝试过这个,但我仍然得到运行时错误。
请注意,在测试用例中,如果使用注释行而不是它们正下方的行并__slots__
从 中删除RefHolder
,则测试用例通过。
有什么建议么?此外,我正在为每个看起来很昂贵的属性访问创建一个对象,是否有任何关于实现相同行为的更有效方法的建议?谢谢!
python - 如何在 Python3 中正确调用 __setattr__() 作为类的一部分?
我想在设置对象属性时调用一个函数:
问题是,这会产生无限递归。
这个想法是在设置成员变量时调用一个函数(并实际设置该成员变量),但同时运行额外的代码(print()
如上例中的语句所示)。
另一种明显的方法是使用set_attrib()
函数,这在 Java 中很常见,但我想用Python的方式来做,直接设置属性,但同时运行额外的代码。
python - 使用 Python setattr 设置对方法或函数的属性引用
我需要使用 setattr 从配置文件中读取,并将类的属性设置为另一个模块中的函数。粗略来说,这就是问题所在。
这有效:
好的,这很简单,但是如果我想some_function
从配置文件中读取名称怎么办?读取文件并使用 setattr 也很简单:
这给了我一个“str”对象不可调用错误。如果我理解正确,那是因为在第一种情况下,我将属性设置为对另一个模块的引用,但在第二种情况下,它只是将属性设置为字符串。
问题:1)我对这个错误的理解正确吗?2)如何使用setattr
将属性设置为对函数的引用而不是简单的字符串属性?
我查看了其他问题并发现了类似的问题,但似乎没有什么可以准确解决这个问题。
python - 在 UI 元素上使用 setattr()
我正在尝试在 UI 元素(QLineEdit)上使用 setattr 来填充从文本文件中读取的内容。我相信为了设置 QlineEdit 它将是self.lineEdit.setText()
我正在阅读的文本文件包含一个名称及其值:
名称 1=值 1
splitLine[0] 由“Name1”组成,splitLine[1] 为“Value1”。self.Name1 是我要更改的 lineEdit 的名称,因此我使用 eval() 将实际值“Name1”传递给 setattr。
我不确定如何设置值。现在我已经尝试了这些但没有成功:
此外,使用:
不起作用,因为它认为实际对象称为 splitLine,而不是它的值(因此我尝试了 eval() )。
python - 使用 Python C-API 定义内部类
在 Python 中,定义内部类很简单:
...可以按照预期访问内部类,例如通过执行MyClass.MyInnerClass
.
我正在尝试使用扩展模块设置类似的东西。通常,将定义的扩展类型添加到模块<modulename>init()
函数中的扩展模块对象,代码如下:
为了设置内部类,我改变了这种方法来尝试添加 aPyTypeObject*
作为 another 的属性PyTypeObject*
,如下所示:
......我认为PyObject_SetAttrString()
可以作为C-API 文档中“类型对象”的介绍特别说明:
可以使用任何
PyObject_*()
或PyType_*()
函数来处理类型对象 […]
…我PyType_Modified()
根据文档中的描述添加了调用。但是这样:当我编译所有内容并尝试加载扩展时,我收到了这个错误:
……我想我的做法是错误的;我应该尝试什么?
python-3.x - 允许 super 控制子类上的 __setattr__
这个问题是关于基于对象的只读问题super()
以及是否/如何超级可以/应该控制__setattr__
子类。
语境:
有没有办法编写元类或描述符,使得作为包含该属性的类的子类的所有类都self.read_only = True
不能执行 getattr 以“set_”开头的子类函数,但是在哪里self.read_only = False
可以呢?
我认为覆盖object.__setattr__(self, name, value)
:
在尝试进行属性分配时调用。这被称为而不是正常机制(即将值存储在实例字典中)。name 是属性名称,value 是要分配给它的值。
...是正确的方向,但我怀疑我对文档的解释是否正确。
例子:
正如系统设计者所期望的那样:
由对所有后果了解有限的系统扩展程序制作的子:
示例注释
在MutableMessage
系统扩展程序中明确声明 read_only 是 False 并且知道添加函数的后果set_topic
。
在ImmutableMessage
(下)中,系统扩展程序忘记声明 message 应该是 read_only=False
这应该导致super
s __setattr__
to raise AttributeError
:
核心问题: 下面示例中所示的用法是否足以一致地应用于基于 BaseMessage 类的所有类?
认为我是元编程的新手。因此,对我的示例的任何误解和/或扩展和更正的解释将是至高无上的。我了解层次结构 [1],但不了解 python 在继承过程中在幕后做了什么。
谢谢...
[1]:层次结构
Python 用于属性的搜索顺序如下所示:
__getattribute__
和__setattr__
- 数据描述符,如属性
- 来自对象的实例变量
__dict__
- 非数据描述符(如方法)和其他类变量
__getattr__
因为
__setattr__
它是排在第一位的,如果你有一个,你需要让它变得聪明,除非希望它处理你班级的所有属性设置。它可以通过两种方式中的任何一种变得聪明。一个。使其仅处理特定的集合属性,或者,
湾。让它处理除某些属性之外的所有属性。
对于您不希望它处理的那些,请致电
super().__setattr__
.
相关问题:
python - Python setattr vs __setattr__ UnicodeEncodeError
我知道setattr
当我们在一个对象之外时我们必须使用方法。但是,我在使用 unicode 键调用时遇到了麻烦setattr
,导致我__setattr__
直接使用。
我得到以下内容obj.properties
:
setattr(obj, u"é", u"à")
: 引发 UnicodeEncodeErrorsetattr(obj, "é", u"à")
:{'\xc3\xa9': u'\xe0'}
obj.__setattr__(u"é", u"à")
:{u'\xe9': u'\xe0'}
我不明白为什么 Python 会出现这些差异
python - Python 中的 __setattr__ 函数
我试图通过使用 getattr 和 setattr 函数来理解 Python 中委派的概念。基本思想是首先通过Professional类在Person类中设置属性'lang'的值,然后检索相同的值。问题是结果是一个无限循环。
python - setattr 不将 self 传递给添加到类的方法
我有一堂课:
我想动态地添加一个方法,但我希望名称基于输入(在我的情况下,基于编码对象属性,但这不是重点)。因此,我正在使用以下方法添加方法:
这一切都很好,有一个警告:
为什么我的实例没有将自己传递给它的新函数?
python - python对象成员变量丢失
我有一个构造函数,它创建一个子类的成员对象:
输出确认该成员的构造函数被调用:
但是当我查看成员时,cv.parent
似乎不存在:
cv.my_args
包含扩展列表。知道这里发生了什么吗?
更新:正如亚历克指出的那样,代码示例确实有效。示例中省略了实际问题,并且我选择了覆盖setattr方法而不允许设置 parent。
起初:
现在: