我想将我自己的类定义中的所有未知函数转发到该类中的对象。人们可以直接访问类中的对象,但想知道是否有一种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
搜索逻辑以查找缺失的属性:
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)
在实现装饰器时偶然发现了这个问题。放在这里以供将来参考:
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__?)