在自身内部创建一个 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_instance
为 None
,value
将为空 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 会推断出value
是 type
或 Any
,但事实并非如此。相反,使用这个:
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))
我知道这个标题可能令人困惑(对此感到抱歉:我是新手),但是这个描述应该会把它弄清楚。基本上,我在 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_instance
为 None
,value
将为空 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 会推断出value
是 type
或 Any
,但事实并非如此。相反,使用这个:
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))