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

Python-__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

问题答案:

你在这里遇到两个基本问题:

  1. __xxx__ 方法只在类上查找
  2. TypeError: can't set attributes of built-in/extension type 'module'
    (1)意味着任何解决方案还必须跟踪正在检查的模块,否则每个模块将具有实例替换行为;(2)表示(1)甚至是不可能的……至少不是直接的。

幸运的是,sys.modules对那里发生的事情并不挑剔,因此可以使用包装器,但是只能用于模块访问(即import somemodule; somemodule.salutation('world'),对于同模块访问,你几乎必须从替换类中提取方法并将其添加到globals()eiher中。类上的自定义方法(我喜欢使用.export())或泛型函数(例如已经列出的答案)要记住的一件事:如果包装器每次都在创建一个新实例,而全局解决方案不是,最终,你会得到完全不同的行为。哦,你不能同时使用两者-一种是另一种。



 类似资料:
  • 问题内容: 如何在模块上的类上实现等价于a的等价物? 例 当调用模块的静态定义属性中不存在的函数时,我希望在该模块中创建一个类的实例,并使用与该模块上的属性查找失败相同的名称调用该方法。 这使: 问题答案: 不久前,Guido宣布对新型类的所有特殊方法查找都绕过and。Dunder方法曾经工作的模块- 你可以,例如,使用一个模块作为一个上下文管理器简单地通过定义和,这些技巧之前爆发。 最近,一些历

  • 本文向大家介绍Python __setattr__、 __getattr__、 __delattr__、__call__用法示例,包括了Python __setattr__、 __getattr__、 __delattr__、__call__用法示例的使用技巧和注意事项,需要的朋友参考一下 getattr `getattr`函数属于内建函数,可以通过函数名称获取 使用`getattr`来实现工厂模

  • fnmatch 模块主要用于文件名称的匹配,其能力比简单的字符串匹配更强大,但比使用正则表达式相比稍弱。。如果在数据处理操作中,只需要使用简单的通配符就能完成文件名的匹配,则使用 fnmatch 模块是不错的选择。 fnmatch 模块中,常用的函数及其功能如表 1 所示。 Python fnmatch模块常用函数及功能 函数名 功能 fnmatch.filter(names, pattern)

  • 相比 pathlib 模块,os.path 模块不仅提供了一些操作路径字符串的方法,还包含一些或者指定文件属性的一些方法,如表 1 所示。 表 1 os.path 模块常用的属性和方法 方法 说明 os.path.abspath(path) 返回 path 的绝对路径。 os.path.basename(path) 获取 path 路径的基本名称,即 path 末尾到最后一个斜杠的位置之间的字符串

  • 主要内容:PurePath 类的用法,Path类的功能和用法和前面章节中引入的模板不同,pathlib 模块中包含的是一些类,它们的继承关系如图 1 所示。 图 1 pathlib模块中类的组织结构 图 1 中,箭头连接的是有继承关系的两个类,以 PurePosixPath 和 PurePath 类为例,PurePosizPath 继承自 PurePath,即前者是后者的子类。 pathlib 模块的操作对象是各种操作系统中使用的路径(例如指定文件位置的路

  • 主要内容:pickle.dumps()函数,pickle.loads()函数,pickle.dump()函数,pickle.load()函数,总结Python 中有个序列化过程叫作 pickle,它能够实现任意对象与文本之间的相互转化,也可以实现任意对象与二进制之间的相互转化。也就是说,pickle 可以实现 Python 对象的存储及恢复。 值得一提的是,pickle 是 python 语言的一个标准模块,安装 python 的同时就已经安装了 pickle 库,因此它不需要再单独安装,使用