问题标签 [getattr]

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 投票
1 回答
547 浏览

python - 艰难地学习 Python:练习 43 函数创建

我的问题源于上面的代码块,可在Learn Python The Hard Way -练习 43中找到。我知道第三行将getattr()函数结果(在本例中self.next为 )存储到room变量中(除非我错了......?)

现在让我感到困惑的是第四行,函数room()存储在变量next中。从根本上说,我不理解这room()部分,因为这不是代码块中定义的函数。Python 是否允许用户根据前面的变量定义函数?(例如:room()第一次编写会room()根据存储在变量中的内容创建一个调用的函数room)。

任何帮助将不胜感激!

0 投票
1 回答
7599 浏览

python - 参数如何通过 __getattr__ 传递给函数

考虑以下代码示例(python 2.7):

可以看出,函数调用通过's函数person.make_statement(20)调用函数。在调用子实例中的相应函数之前,我可以在函数中打印出属性。到目前为止很清楚。Child.make_statementParent__getattr____getattr__

但是调用的参数是如何person.make_statement(20)通过的__getattr__呢?如何在我的__getattr__函数中打印出数字“20”?

0 投票
1 回答
1229 浏览

python - 如何使用 __getattr__ 访问调用参数和参数

我有以下代码,其中大部分代码看起来很尴尬、令人困惑和/或间接,但其中大部分是为了演示我遇到问题的更大代码的部分。请仔细阅读

我想要的是捕获所有方法调用,DeviceProxy以便能够打印所有参数/参数等等。在给定的示例中,这在调用时效果很好info(1),所有信息都被打印出来。但是当我调用双点函数dev.obj.foo(3)时,我只得到这不是可调用的消息。

如何修改上述代码,以便在第二种情况下获得我的信息?只能修改下面的代码===

0 投票
1 回答
3147 浏览

python - `setattr`(和`getattr`)的使用可以被认为是不好的做法吗?

setattr并且getattr有点进入我的编程风格(主要是科学的东西,我对 python 的了解是自说自话的)。

考虑到这一点execeval继承潜在的危险,因为在某些情况下它们可能会导致安全问题,我想知道对于setattr相同的论点是否被认为是有效的。(关于getattr我发现这个问题包含一些信息 - 尽管论证不是很有说服力。)

据我所知,setattr可以不用担心太多,但老实说我不太相信我的python知识,如果我错了,我想尝试改掉使用的习惯setattr.

非常感谢任何输入!

0 投票
1 回答
5824 浏览

python - getattr() 与 dict 查找,哪个更快?

一个有点无聊的最佳实践问题。object.__dict__[some_key]我习惯性地使用动态查找对象属性值。现在我想知道哪个更好/更快:我目前的习惯或getattr(object,some_key). 如果一个更好,为什么?

0 投票
3 回答
3910 浏览

python - 使用 getattr throwing 访问的绑定 Python 方法:“不接受任何参数(给定 1 个)”

在我无法理解的绑定方法、继承和 getattr 之间的交互中发生了一些相当奇怪的事情。

我有一个目录设置,如:

import_module.py 包含许多类对象,其中一个是这种形式:

start_module.py 中的一个函数使用inspect 来获取表示imported_module.py 中的类的字符串列表。“Foo”是这些字符串中的第一个。目标是使用该字符串和 getattr.* 在 start_module.py 中运行 bar

为此,我使用以下形式的 start_module 代码:

它确实成功地开始迭代列表理解,但是在第一个字符串“bar”上,我得到了一个奇怪的错误。尽管 bar 是一个绑定方法,据我所知,期望 Foo 的实例作为参数,我被告知:

TypeError: bar() 不接受任何参数(给定 1 个)

这使得我对 function() 的调用似乎传递了 Foo 实例,但代码并不期望接收它。

我真的不知道这里发生了什么,也无法通过查看 Google 和 Stack Overflow 来解析出一个解释。双重 getattr 是否会导致一些奇怪的交互?我对 Python 中的类对象的理解是否过于模糊?我很想听听你的想法。

*为了避免反模式,真正的最终目标是让 start_module.py 自动访问各种类的名称栏的所有方法,类似于 import_module.py 中的 Foo。我这样做是为了避免让我的继任者维护一个可能非常多的类似 Foo 的类的列表。

回答如下:我认为这里最大的收获是检查非常有用,如果您遇到的错误有共同的原因,请在继续寻找其他可能性之前绝对确保您已经排除了这种可能性。在这种情况下,我忽略了一个事实,即我正在查看的具有正确代码的模块可能不是由于最近对文件结构进行的编辑而被导入的模块。

0 投票
2 回答
1544 浏览

python - 有没有办法覆盖 Python 中任意对象的双下划线(魔术)方法?

我想编写一个包装类,它接受一个值并且除了添加一个“原因”属性外,它的行为就像它一样。我有这样的想法:

但是,双下划线函数似乎没有被捕获__getattribute__,例如:

我认为以上两个最终应该这样做:

为什么这没有发生?我怎样才能让它发生?(在实际代码中实际使用这可能是一个可怕的想法,但我现在对技术问题很好奇。)

0 投票
2 回答
1986 浏览

python - 如何使用 __getattr__ 函数处理和返回 Python 类中缺少的属性和函数?

在 Python 类上使用特殊方法来处理缺少的属性或函数相当容易__getattr__,但似乎不能同时处理两者。

考虑这个例子,它处理任何在类的其他地方没有明确定义的请求的属性......

接下来,考虑这个例子,它处理在类的其他地方没有明确定义的任何函数调用......

问题是如何同时处理两种类型的缺失属性__getattr__?如何检测请求的属性是属性表示法还是带括号的方法表示法并分别返回值或函数?本质上,我想处理一些缺失的属性属性和一些缺失的函数属性,然后在所有其他情况下采用默认行为。

建议?

0 投票
2 回答
105 浏览

python - 通过继承巧妙地处理不同的权限

我必须管理权限并且我有不同的用户类型,例如这里的一对。

现在我希望能够拥有 MultiRole 类型,理论上它应该能够做它的角色能够做的所有事情。

我尝试过这样的事情:

哪个应该用作

但这不起作用,理想情况下,我想为传入的所有类调用方法并执行 or (with any)。

问题是要调用我需要有一个该类型的对象的方法..

理论上,我什至可以只为每个角色使用字典,但我喜欢默认为 false 的技巧,有时我还需要一个函数来计算权限。

有什么建议么?

0 投票
3 回答
5095 浏览

python - 使用 getattr 获取方法的对象引用

说,我有以下被class称为Testmethodstart

现在,我有一个独立的function名为func

[1] 现在,t.start是属于method的一个instance of __main__.Test0xb769678c

[2] funcfunction属于哪个位置的0xb767ec6c

现在,我们可以使用 builtin来提取__module__fromt.start和。不出意外,和属于同一个iefunc__module__funct.startmodule__main__

[3] 现在,让我们将__module__for存储t.start在一个变量中obj

现在,我getattr()用来获取函数的func句柄如下,输出是[2]<function func at 0xb767ec6c>funcgetattr()identical

问题:

我如何使用和模块名称 [3] 来获取应该是 [1]getattr()的句柄Test.start<bound method Test.start of <__main__.Test instance at 0xb769678c>>

当我尝试使用getattr()时,'t.start'我得到以下Traceback

换句话说,我有两个数据。他们是

  1. __import__('__main__')
  2. 'Test.start'

现在,我如何获得应该是t.start(注意这里)的句柄instance<bound method Test.start of <__main__.Test instance at 0xb769678c>>