提问人:jlettvin 提问时间:7/6/2023 更新时间:7/6/2023 访问量:27
python3 可以通过异常处理动态创建缺失的方法吗?
can python3 create missing methods on the fly through exception handling?
问:
我想修改类实例行为。
class A:
def __init__(self): pass
def methodA(self): return "methodA"
a = A()
print(a.methodA())
print(a.methodB())
在 a.methodB() 期间抛出的异常是在类 A 实例 a 的上下文中。 异常处理程序可以将 methodB 添加到实例 a 中,并具有新方法的默认行为。
我一直在寻找有关如何在 a 的上下文中停止异常、添加方法、调用方法和中止异常的提示。 我希望很多人会说“为什么?我需要它来动态创建链式实例以通过点名寻址,例如对于类 A 实例 a,我想引用 a.b.c.d.e.f,或调用 a.b.c.d.e.f() 并让链在每个级别都具有默认结构的实例化......按引用实例化。不知何故,解释器必须重写 NotImplementedError 或类似的东西。
如果没有一点帮助,这感觉超出了我的实施能力。这似乎并非不可能。是吗?
答:
1赞
BlackFox
7/6/2023
#1
对此进行了一些研究,并找到了一种方法:getattr
好博客:https://medium.com/@satishgoda/python-attribute-access-using-getattr-and-getattribute-6401f7425ce6
例:
class ABC:
def __init__(self):
pass
def methodA(self):
return "methodA"
def __getattr__(self, name):
# Define the default behavior for undefined methods
def default_method(*args, **kwargs):
return f"default behavior for {name}"
# Return the default method when an undefined method is accessed
return default_method
a = ABC()
print(a.methodA()) # Output: "methodA"
print(a.methodB()) # Output: "default behavior for methodB"
以下是我的模组,它们完全符合我的预期:
class Foo:
def __init__(self,name):
self.name = name
def __str__(self):
return self.name
def __getattr__(self, name):
self.__dict__[name] = Foo(self.name+'.'+name)
return self.__dict__[name]
foo = Foo("foo")
print(foo.bar.baz)
评论
1赞
jlettvin
7/6/2023
我非常喜欢它。我将用模组修改原始帖子到您的代码中,使其做我想做的事......
评论