使用类自变量作为默认类方法参数[重复]
Posted
技术标签:
【中文标题】使用类自变量作为默认类方法参数[重复]【英文标题】:Use class self variable as default class method argument [duplicate] 【发布时间】:2019-03-22 01:39:12 【问题描述】:我可以在python
的方法定义中使用self
参数吗?
class Test:
def __init__(self, path):
self.path = pathlib.Path(path)
def lol(self, destination=self.path):
x = do_stuff(destination)
return x
我可以制作def lol(self, destination)
并以这种方式使用它test_obj.lol(test_obj.path)
。但是有没有办法将默认的destination arg
设置为self.path
?下面发布的另一种方式(基于this answers),但我可以以某种方式重构它并使其更优雅吗?也许python3.+版本有新的解决方案。
def lol(self, destination=None):
if destination in None:
destination = self.path
x = do_stuff(destination)
return x
【问题讨论】:
可以在类'__init__
中动态添加实例方法。在那里你可以访问实例变量。
@a_guest,但我可以从外部使用__init__
中定义的方法吗?
def lol(self, destination=self.path):
这个声明已经有了你正在寻找的默认值。只需将您想要的任何内容传递到目的地,如果您希望它获取任何其他值。
@Alex 另外,您需要通过self.lol = lol
将其设置为实例属性。然后就可以正常访问了。稍后我会发布一个示例。
在定义函数时计算参数,而不是在调用它或创建对象时。定义函数时没有名为“self”的对象,除非你做了一些奇怪的事情,比如有一个不同类型的全局变量,它也有一个path
属性。
【参考方案1】:
没有。
这会导致问题,因为self.Path
可能会随着运行时间而改变。
但是默认参数都是在创建时评估的。
因此,destination 始终是一个静态值,在任何时候都可能与 self.Path
不同。
编辑:
见Why are default arguments evaluated at definition time in Python?
【讨论】:
【参考方案2】:我将如何重构代码:
def func_test(self, destination=None):
return do_stuff(destination or self.path)
以上是最干净和最危险的。 - 您知道价值的最佳案例场景,并且 or
非常适合。 - 否则粗心使用它。
否则我会选择:
def func_test(self, destination=None):
return do_stuff(destination if destination is not None else self.path)
关于将self.property
传递给函数参数;根本没有。
【讨论】:
这不会明确检查None
。它将回退到任何错误值。这绝对不同于OP。此外,它没有回答问题(关于实例变量作为实例方法的默认参数)。
不要随意使用or
。如果我通过destination=''
怎么办?
所以如果destination
!= False
/None
/empty_value
就可以了,对吧?
@Alex or
正如其他人所指出的那样,非常粗心,除非您绝对确定传入的数据类型。 - or
将回退到任何错误值(意思是'', False,None 等) - 如果这是您需要的,那么这对您来说是完美的。 - 但正如@Aran-Fey 所说,请注意使用它的位置。 :)以上是关于使用类自变量作为默认类方法参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章