问题标签 [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.

0 投票
0 回答
435 浏览

python - 在 python3 类中使用 __setattr__ + __slots__

我试图在自定义类层次结构中使用子元素属性访问。我的幻想在于我可以成功地使用描述符来做到这一点。我想更花哨,让类RefHolder(在下面的测试用例中显示)使用插槽来节省空间。

但是,当我尝试使用插槽时,我得到了RuntimeError: maximum recursion depth exceeded

请注意,我已经尝试查看现有的解决方案,我能找到的最匹配的是这个:

https://stackoverflow.com/a/19566973/1671693

我已经在下面的测试用例中尝试过这个,但我仍然得到运行时错误。

请注意,在测试用例中,如果使用注释行而不是它们正下方的行并__slots__从 中删除RefHolder,则测试用例通过。

有什么建议么?此外,我正在为每个看起来很昂贵的属性访问创建一个对象,是否有任何关于实现相同行为的更有效方法的建议?谢谢!

0 投票
2 回答
5096 浏览

python - 如何在 Python3 中正确调用 __setattr__() 作为类的一部分?

我想在设置对象属性时调用一个函数:

问题是,这会产生无限递归。

这个想法是在设置成员变量时调用一个函数(并实际设置该成员变量),但同时运行额外的代码(print()如上例中的语句所示)。

另一种明显的方法是使用set_attrib()函数,这在 Java 中很常见,但我想用Python的方式来做,直接设置属性,但同时运行额外的代码。

0 投票
2 回答
2553 浏览

python - 使用 Python setattr 设置对方法或函数的属性引用

我需要使用 setattr 从配置文件中读取,并将类的属性设置为另一个模块中的函数。粗略来说,这就是问题所在。

这有效:

好的,这很简单,但是如果我想some_function从配置文件中读取名称怎么办?读取文件并使用 setattr 也很简单:

这给了我一个“str”对象不可调用错误。如果我理解正确,那是因为在第一种情况下,我将属性设置为对另一个模块的引用,但在第二种情况下,它只是将属性设置为字符串。

问题:1)我对这个错误的理解正确吗?2)如何使用setattr将属性设置为对函数的引用而不是简单的字符串属性?

我查看了其他问题并发现了类似的问题,但似乎没有什么可以准确解决这个问题。

0 投票
2 回答
554 浏览

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() )。

0 投票
1 回答
727 浏览

python - 使用 Python C-API 定义内部类

在 Python 中,定义内部类很简单:

...可以按照预期访问内部类,例如通过执行MyClass.MyInnerClass.

我正在尝试使用扩展模块设置类似的东西。通常,将定义的扩展类型添加到模块<modulename>init()函数中的扩展模块对象,代码如下:

为了设置内部类,我改变了这种方法来尝试添加 aPyTypeObject*作为 another 的属性PyTypeObject*,如下所示:

......我认为PyObject_SetAttrString()可以作为C-API 文档中“类型对象”的介绍特别说明:

可以使用任何PyObject_*()PyType_*()函数来处理类型对象 […]

…我PyType_Modified()根据文档中的描述添加了调用。但是这样:当我编译所有内容并尝试加载扩展时,我收到了这个错误:

……我想我的做法是错误的;我应该尝试什么?

0 投票
1 回答
1338 浏览

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这应该导致supers __setattr__to raise AttributeError

核心问题: 下面示例中所示的用法是否足以一致地应用于基于 BaseMessage 类的所有类?

认为我是元编程的新手。因此,对我的示例的任何误解和/或扩展和更正的解释将是至高无上的。我了解层次结构 [1],但不了解 python 在继承过程中在幕后做了什么。

谢谢...

[1]:层次结构

Python 用于属性的搜索顺序如下所示:

  1. __getattribute____setattr__
  2. 数据描述符,如属性
  3. 来自对象的实例变量__dict__
  4. 非数据描述符(如方法)和其他类变量
  5. __getattr__

因为__setattr__它是排在第一位的,如果你有一个,你需要让它变得聪明,除非希望它处理你班级的所有属性设置。它可以通过两种方式中的任何一种变得聪明。

一个。使其仅处理特定的集合属性,或者,

湾。让它处理除某些属性之外的所有属性。

对于您不希望它处理的那些,请致电super().__setattr__.

相关问题:

0 投票
2 回答
877 浏览

python - Python setattr vs __setattr__ UnicodeEncodeError

我知道setattr当我们在一个对象之外时我们必须使用方法。但是,我在使用 unicode 键调用时遇到了麻烦setattr,导致我__setattr__直接使用。

我得到以下内容obj.properties

  • setattr(obj, u"é", u"à"): 引发 UnicodeEncodeError
  • setattr(obj, "é", u"à"){'\xc3\xa9': u'\xe0'}
  • obj.__setattr__(u"é", u"à"){u'\xe9': u'\xe0'}

我不明白为什么 Python 会出现这些差异

0 投票
2 回答
4888 浏览

python - Python 中的 __setattr__ 函数

我试图通过使用 getattr 和 setattr 函数来理解 Python 中委派的概念。基本思想是首先通过Professional类在Person类中设置属性'lang'的值,然后检索相同的值。问题是结果是一个无限循环。

0 投票
0 回答
100 浏览

python - setattr 不将 self 传递给添加到类的方法

我有一堂课:

我想动态地添加一个方法,但我希望名称基于输入(在我的情况下,基于编码对象属性,但这不是重点)。因此,我正在使用以下方法添加方法:

这一切都很好,有一个警告:

为什么我的实例没有将自己传递给它的新函数?

0 投票
1 回答
144 浏览

python - python对象成员变量丢失

我有一个构造函数,它创建一个子类的成员对象:

输出确认该成员的构造函数被调用:

但是当我查看成员时,cv.parent似乎不存在:

cv.my_args包含扩展列表。知道这里发生了什么吗?

更新:正如亚历克指出的那样,代码示例确实有效。示例中省略了实际问题,并且我选择了覆盖setattr方法而不允许设置 parent。

起初:

现在: