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

问题描述 投票:0回答:2

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

python methods catch-all
2个回答
4
投票

您可以覆盖

__getattr__
并在其中添加
self.object
搜索逻辑以查找缺失的属性:

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) 
                                                                                                                                                                                                    
    
    m = MyClass('foo', str)                                                                                                                                                                            
    
    m.lower                                                                                                                                                                                            
    # <method 'lower' of 'str' objects>
    
    m.known_function('spam')                                                                                                                                                                           
    # 'spam_blabla'

这里我们检查

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

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

types.MethodType
检查。


此外,您在

name
中引用了名称
known_function
,该名称在本地范围内不存在,您可能打算采用
name
参数或 使用
self.name


编辑:

实际上

__getattr__
在属性查找链中最后被调用,因此您可以删除对
self.__dict__
的检查,因为此检查 已经在之前完成了,因此:

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) 

0
投票

在实现装饰器时偶然发现了这个问题。放在这里以供将来参考:

class Decorator():
    def __init__(self, seed):
        self._seed = seed

    def decorated(self):
        return self

    def __getattr__(self, attr):
        return self._seed.__getattribute__(attr)

Python3 对两个

__getattr__
都有钩子,但默认情况下仅存在
__getattribute__
为什么缺少 object.__getattr__?

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.