gpt4 book ai didi

python - 当给定的方法不存在时调用类中的另一个方法?

转载 作者:行者123 更新时间:2023-11-28 20:55:13 25 4
gpt4 key购买 nike

假设我有一个包含多个函数的类。

class Person:
def __init__(self): pass
def say(self, speech): pass
def walk(self, destination): pass
def jump(self): pass

当用户实例化一个 Person 时,我希望他们能够调用该类的任何 方法。如果请求的方法不存在(例如 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"

但是,我不知道有这样神奇的方法。

有没有办法让一个类中不存在的方法重定向到另一个类?

重要的是,最终用户无需执行任何操作 - 从他们的角度来看,它应该可以正常工作。

最佳答案

捕获未定义属性的标准方法是使用__getattr__:

# But see the end of the answer for an afterthought
def __getattr__(self, attr):
return self.sleep

Python 不区分“常规”属性和方法;方法调用以普通属性查找开始,其结果恰好是可调用的。也就是说,

billy.run()

相同
f = billy.run
f()

这意味着__getattr__ 将被任何 未定义的属性调用;在查找时无法判断结果是否会被调用。


但是,如果您只想为通用方法定义“别名”,则可以在 class 语句之后使用循环来实现。

class Person:
def __init__(self): pass
def say(self, speech): pass
def walk(self, destination): pass
def jump(self): pass
def do_all(self): pass

for alias in ["something", "something_else", "other"]:
setattr(Person, alias, Person.do_all)

您还可以在 class 语句中进行硬编码赋值,但如果如您所述,有数百个这样的情况,那将很笨拙:

class Person:
def do_all(self): pass

something = do_all
something_else = do_all

(我没有尝试使用 exec 在循环中自动执行此类分配;这可能是可行的,但不推荐。)

您还可以在 __getattr__ 的定义中嵌入别名列表,想一想:

 def __getattr__(self, attr):
if attr in ["something", "something_else", "other"]:
return self.sleep
else:
raise AttributeError(f"type object 'Person' has no attribute '{attr}'")

关于python - 当给定的方法不存在时调用类中的另一个方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57462343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com