python - 类中的 Catch-all 方法,将所有未知函数传递给类中的实例

标签 python methods catch-all

我想将我自己的类定义中的所有未知函数转发到该类中的对象。人们可以直接访问类中的对象,但想知道是否有一种Python式的方法来直接传递属于该对象的所有方法。将其视为方法或直通的“包罗万象”。

尝试了getattr,但未能让它完全按照我想要的方式进行。

class MyClass(): 

   def __init__(self, name, object): 
         self.name = name
         self.object = object

   def known_function(self): 
         return '{}_blabla'.format(self.name) 

   def all_unknown_functions(self): 
         return self.object.thisunknownfunction()

想要:所有未知函数都传递到我的类内的对象,而无需重新定义所有这些函数。

编辑:getattr 方法与 all_unknown_functions 方法相同 edit2:修复known_function中的参数

最佳答案

您可以覆盖__getattr__并添加您的 self.object那里缺少属性的搜索逻辑:

In [12]: class MyClass():  
    ...:    def __init__(self, name, obj):  
    ...:          self.name = name 
    ...:          self.obj = obj 
    ...:  
    ...:    def known_function(self, name):  
    ...:          return '{}_blabla'.format(name) 
    ...:           
    ...:    def __getattr__(self, attr): 
    ...:        if attr not in self.__dict__: 
    ...:            return getattr(self.obj, attr) 
    ...:        return super().__getattr__(attr) 
    ...:                                                                                                                                                                                                    

In [13]: m = MyClass('foo', str)                                                                                                                                                                            

In [14]: m.lower                                                                                                                                                                                            
Out[14]: <method 'lower' of 'str' objects>

In [15]: m.known_function('spam')                                                                                                                                                                           
Out[15]: 'spam_blabla'

这里我们检查 attr 是否是否在实例字典中,如果没有,我们从 self.obj 获取属性.

请注意,这将获取任何属性,而不仅仅是函数。您可以添加types.MethodType稍后检查。

<小时/>

此外,您还引用了名称 nameknown_function ,它在本地范围内不存在,您可能想采用 name论证或 使用self.name .

<小时/>

编辑:

实际上__getattr__在属性查找链中最后调用,因此您可以删除对 self.__dict__ 的检查。由于此检查之前已经完成,因此请执行以下操作:

In [16]: class MyClass(): 
...:    def __init__(self, name, obj):  
...:          self.name = name 
...:          self.obj = obj 
...:  
...:    def known_function(self, name):  
...:          return '{}_blabla'.format(name) 
...:           
...:    def __getattr__(self, attr): 
...:        return getattr(self.obj, attr) 
...:                                                     

关于python - 类中的 Catch-all 方法,将所有未知函数传递给类中的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091503/

相关文章:

java - 为什么这个 Java 方法看起来有两种返回类型?

python - Python 中的多个字符串插值

java - 如何使用 Class.getMethod 作为 getter?

python - 如何更改 turtle 的颜色,而不是笔的颜色?

java - 无法解析在公共(public)方法中启动的对象?

php - 在 PHP 中创建一个 Catch-All 处理程序?

scala - 捕获 Scala 2.8 RC1 中的所有异常

configuration - nginx catchallconf 文件未捕获所有内容

python - 有没有办法用 PyGTK AppIndicator 检测鼠标点击

python - 如何防止 C 共享库在 python 的标准输出上打印?