class 中的包罗万象的方法将所有未知函数传递给 class 中的实例
Catch-all method in class that passes all unknown functions to instance in class
我想将我自己的 class 定义中的所有未知函数转发给那个 class 中的一个对象。可以直接访问 class 中的对象,但想知道是否有一种 pythonic 方式直接传递属于该对象的所有方法。将其视为方法或传递的 'catch-all'。
尝试了 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()
想要:所有未知函数都传递给我 class 中的对象,而我不必重新定义所有这些函数。
编辑: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
检查。
此外,您在 known_function
中引用了名称 name
,它在本地范围内不存在,您可能打算采用 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)
...:
我想将我自己的 class 定义中的所有未知函数转发给那个 class 中的一个对象。可以直接访问 class 中的对象,但想知道是否有一种 pythonic 方式直接传递属于该对象的所有方法。将其视为方法或传递的 'catch-all'。
尝试了 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()
想要:所有未知函数都传递给我 class 中的对象,而我不必重新定义所有这些函数。
编辑: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
检查。
此外,您在 known_function
中引用了名称 name
,它在本地范围内不存在,您可能打算采用 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)
...: