我想将我自己的类定义中的所有未知函数转发到该类中的对象。人们可以直接访问类中的对象,但想知道是否有一种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中的参数
最佳答案
您可以覆盖__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__
的检查。由于此检查之前已经完成,因此请执行以下操作:
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)
...:
关于python - 类中的 Catch-all 方法,将所有未知函数传递给类中的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57091503/