class 中的包罗万象的方法将所有未知函数传递给 class 中的实例

Catch-all method in class that passes all unknown functions to instance in class

我想将我自己的 class 定义中的所有未知函数转发给那个 class 中的一个对象。可以直接访问 class 中的对象,但想知道是否有一种 pythonic 方式直接传递属于该对象的所有方法。将其视为方法或传递的 'catch-all'。

尝试了 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()

想要:所有未知函数都传递给我 class 中的对象,而我不必重新定义所有这些函数。

编辑: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 检查。


此外,您在 known_function 中引用了名称 name,它在本地范围内不存在,您可能打算采用 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) 
...: