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