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

时间:2019-07-18 09:39:36

标签: python methods catch-all

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

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

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

edit:getattr方法将与all_unknown_functions方法相同 edit2:修复了known_function中的参数

1 个答案:

答案 0 :(得分:2)

您可以覆盖__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支票。


此外,您在name中引用了名称known_function,该名称在本地范围内不存在,您可能想使用name自变量,或者 使用self.name


编辑:

实际上,__getattr__在属性查找链中被称为最后一个,因此您可以删除self.__dict__的检查,因为该检查早已完成,所以这样做:< / p>

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) 
...: