使用类自变量作为默认类方法参数[重复]

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 所说,请注意使用它的位置。 :)

以上是关于使用类自变量作为默认类方法参数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python 中使用类变量作为默认参数值

Java基础学习笔记十二 类抽象类接口作为方法参数和返回值以及常用API

使用类作为其方法中参数的类型提示[重复]

如何在Python中定义静态变量

使用类属性值作为方法默认参数的替代方法?

在java中,将局部变量作为参数传递到另一个类的方法里,在此方法里改变参数值,局部变量会改变吗