在自身内部创建一个 class 实例作为默认参数

Creating a class instance as a default argument inside itself

我知道这个标题可能令人困惑(对此感到抱歉:我是新手),但是这个描述应该会把它弄清楚。基本上,我在 class 中创建了一个带有参数的函数,如果未指定,我希望该参数默认成为 class 的实例。

这是我认为可行的方法:

class Agent:
    def __init__(self, value = dict):
        self.value = value

    def arbitrary(self, other_instance = self.__class__({})):
        print(other_instance.value.get('placeholder', 0))

但是,它声称自己没有定义。理论上,我可以简单地做

    def arbitrary(self, other_instance = None):
        if other_instance is None:
            other_instance = self.__class__({})
        print(other_instance.value.get('placeholder', 0))

然而,这是拼凑而成的,所以我想知道在我诉诸类似的东西之前,是否有一种方法可以在默认参数中做到这一点。

对于您的实际问题可能有更好的解决方案,但由于您没有分享这些细节,因此很难说出具体的解决方案。

但是,对于您给出的示例,如果 other_instanceNonevalue 将为空 dict,因此调用.get() 只能 return 0.

所以,这等价于:

    def arbitrary(self, other_instance = None):
        if other_instance is None:
            print(0)
        else:
            print(other_instance.value.get('placeholder', 0))

这完全避免了一次性实例的构造。

您的实际用例可能会更多,但很可能还有比 on-the-fly 创建空实例更好的解决方案。如果没有,您使用 None 的解决方案是预期的方法。

(注意:在第一个例子中的构造函数中将value设置为dict实际上将其设置为类型,而不是一个空实例,这可能是您想要的 - 但是,这样做会导致有关可变默认值的警告,正确的解决方案是使用 None 并在正文中进行初始化)

编辑:在评论中您指出您将 value 设置为 dict 以表明需要什么类型 - 但是,这会产生不需要的副作用,一些 IDE 会推断出valuetypeAny,但事实并非如此。相反,使用这个:

from typing import Optional


class ClassName:
    def arbitrary(self, other_instance: Optional[dict] = None):
        if other_instance is None:
            print(0)
        else:
            print(other_instance.value.get('placeholder', 0))