当前位置: 首页 > 面试题库 >

__getattr__在模块上

韦寒
2023-03-14
问题内容

如何__getattr__在模块上的类上实现等价于a的等价物?

当调用模块的静态定义属性中不存在的函数时,我希望在该模块中创建一个类的实例,并使用与该模块上的属性查找失败相同的名称调用该方法。

class A(object):
    def salutation(self, accusative):
        print "hello", accusative

# note this function is intentionally on the module, and not the class above
def __getattr__(mod, name):
    return getattr(A(), name)

if __name__ == "__main__":
    # i hope here to have my __getattr__ function above invoked, since
    # salutation does not exist in the current namespace
    salutation("world")

这使:

matt@stanley:~/Desktop$ python getattrmod.py 
Traceback (most recent call last):
  File "getattrmod.py", line 9, in <module>
    salutation("world")
NameError: name 'salutation' is not defined

问题答案:

不久前,Guido宣布对新型类的所有特殊方法查找都绕过__getattr__and__getattribute__。Dunder方法曾经工作的模块-
你可以,例如,使用一个模块作为一个上下文管理器简单地通过定义__enter____exit__,这些技巧之前爆发。

最近,一些历史功能已经卷土重来,其中的一个模块已被卷土重来,__getattr__因此,sys.modules不再需要现有的hack(在导入时将一个模块替换为一个类)。

在Python
3.7+中,您仅使用一种显而易见的方法。要自定义模块上的属性访问,请__getattr__在模块级别定义一个函数,该函数应接受一个参数(属性名称),然后返回计算值或引发一个AttributeError

# my_module.py

def __getattr__(name: str) -> Any:
    ...

这也将允许钩入“ from”导入,即,您可以为诸如的语句返回动态生成的对象from my_module import whatever

与此相关的是,您还可以与模块getattr一起__dir__在模块级别定义一个函数以响应dir(my_module)。有关详细信息,请参见PEP
562



 类似资料:
  • 问题内容: 如何在模块上的类上实现等价于a 的等效项? 例 当调用模块的静态定义属性中不存在的函数时,我希望在该模块中创建一个类的实例,并使用与该模块上的属性查找失败相同的名称调用该方法。 这使: 问题答案: 你在这里遇到两个基本问题: 方法只在类上查找 (1)意味着任何解决方案还必须跟踪正在检查的模块,否则每个模块将具有实例替换行为;(2)表示(1)甚至是不可能的……至少不是直接的。 幸运的是,

  • 问题内容: 我有一个使用Java Webstart技术的项目。我决定将Java版本从8升级到9。但是,在编译时遇到以下错误: 我试图将其包含到类路径中,但仍然存在相同的问题。 问题答案: 看起来默认情况下,类路径上的代码未解析 java.jnlp (非常类似于Java EE模块 )。解决的办法是用明确添加(两者并接受参数)。 JEP 261:模块系统 或此博客文章中讨论了此选项。

  • 因此,我在工作SOAP客户机示例中使用了SOAP示例,将其放入一个文件,并尝试编译它(Debian上的Openjdk 9): 在谷歌搜索了一些之后,我发现编译和运行 作品。请参阅此视频了解一般背景:https://www.youtube.com/watch?v=y8bpKYDrF5I 现在,问题: 编译器不应该自动添加java模块吗。xml。ws?(因为它显然知道需要它)这是javax中的一个bu

  • 问题内容: 因此,我在WorkingSoap客户端示例中使用SOAP示例,将其放入文件中,然后尝试对其进行编译(Debian上的Openjdk 9): 谷歌搜索了一些之后,我发现编译和运行为 作品。另请参见此视频的一般背景:https : //www.youtube.com/watch?v=y8bpKYDrF5I&t=20m17s 现在,问题: 编译器是否应该自动添加模块java.xml.ws?(

  • 问题内容: 我有一个包裹在另一个里面的物体。“包装器”通过重写从“包装”对象访问属性。直到我需要重写子类上的属性,然后使用来从基类访问该属性之前,此方法都有效。 我仍然可以直接从中访问属性,但是为什么不起作用? 问题答案: 据此, super不允许隐式调用诸如的“ hook”函数。我不确定为什么要用这种方式实现(这可能是一个很好的理由,并且由于超级对象具有自定义和方法,所以事情已经很混乱了),但似