假设我有一个包含几个函数的类。你知道吗
class Person:
def __init__(self): pass
def say(self, speech): pass
def walk(self, destination): pass
def jump(self): pass
当用户实例化一个人时,我希望他们能够调用类的任何方法。如果请求的方法不存在(例如Person.dance()
),则应该调用默认函数。你知道吗
我想这可以通过理论上的魔法方法来实现-
class Person:
def __init__(self): pass
def say(self, speech): pass
def walk(self, destination): pass
def jump(self): pass
def sleep(self): print("Zzz")
def __method__(self, func):
if func.__name__ not in ['say','walk','jump']:
return self.sleep
else
return func
billy = Person()
billy.dance()
>> "Zzz"
然而,我知道没有这种神奇的方法。你知道吗
有没有办法让一个类中不存在的方法重定向到另一个类?你知道吗
重要的是,最终用户不必做任何事情-从他们的角度来看,它应该只是工作。你知道吗
您的用户可能会发现API行为令人困惑。然而,如果你确定你需要这种模式,你可以尝试类似的方法
捕获未定义属性的标准方法是使用
__getattr__
:Python不区分“常规”属性和方法;方法调用从普通属性查找开始,其结果恰好是可调用的。也就是说
与相同
这意味着
__getattr__
将为任何未定义的属性调用;在查找时无法判断是否要调用结果。你知道吗但是,如果您只想为一个公共方法定义“别名”,那么可以在
class
语句之后使用循环来实现。你知道吗您也可以在的
class
语句中进行硬编码赋值,但是如果您提到的这种情况有数百种,那么这将是很难处理的:(我没有尝试使用
exec
在循环中自动执行此类分配;这可能是可能的,但不建议这样做。)您还可以将别名列表嵌入到
__getattr__
的定义中,想想看:您可以将“default”函数嵌套在
__getattr__
中,以便访问被调用的不存在的方法的名称和参数。你知道吗相关问题 更多 >
编程相关推荐