1

我想将我自己的类定义中的所有未知函数转发到该类中的一个对象。可以直接访问类中的对象,但想知道是否有一种 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 中的参数

4

1 回答 1

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您可以稍后添加支票。


此外,您在 中引用了该名称,该名称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) 
...:                                                     
于 2019-07-18T09:56:15.857 回答