python3 可以通过异常处理动态创建缺失的方法吗?

can python3 create missing methods on the fly through exception handling?

提问人:jlettvin 提问时间:7/6/2023 更新时间:7/6/2023 访问量:27

问:

我想修改类实例行为。

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 或类似的东西。

如果没有一点帮助,这感觉超出了我的实施能力。这似乎并非不可能。是吗?

python-3.x 异常 扩展器

评论


答:

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
我非常喜欢它。我将用模组修改原始帖子到您的代码中,使其做我想做的事......