如何将类的数据属性用作类方法中的默认参数?

时间:2014-12-28 02:02:50

标签: python class methods arguments self

假设我想将类方法的参数的默认值设置为类的某个数据属性的值。这样做的适当方法是什么?有没有办法使用lambda函数来做到这一点?

以下是一些示例代码:

class A(object):

    def __init__(
        self
        ):
        self._defaultReportText = "hello world"

    def report(
        self,
        text = self._defaultReportText
        ):
        return(text)

显然,方法text的参数report的默认值规范在此处不起作用,因为此时未定义self。我应该如何提供这个值?

3 个答案:

答案 0 :(得分:7)

如果我理解你的问题,我通常会这样做:

def report(self, text = None):
    if text is None:
        text = self._defaultReportText
    return(text)

(编辑:在Warren Weckesser的建议之后将if not text更改为if text is None。)

答案 1 :(得分:4)

您无法在类定义时设置默认值,因为默认值与函数对象一起存储,因此没有实例可用于从中获取默认

相反,请使用 sentinel ,这是一个您可以轻松测试的唯一值。通常这是None

class A(object):
    def __init__(self):
        self._defaultReportText = "hello world"

    def report(self, text=None):
        if text is None:
            text = self._defaultReportText
        return text

如果没有提供text参数,则默认为None,并且可以轻松测试。

如果None应该是一个可能的值(例如,您希望能够使用A().report(None)并且行为与A().report()不同,那么您将不得不选择不同的哨兵在这种情况下,使用object()的唯一实例来测试:

_sentinel = object()


class A(object):
    def __init__(self):
        self._defaultReportText = "hello world"

    def report(self, text=_sentinel):
        if text is _sentinel:
            text = self._defaultReportText
        return text

答案 2 :(得分:-1)

使用特殊值(如None)的替代方法是使用类变量:

class A(object):
    _defaultReportText = "hello world"

    def report(self, text=_defaultReportText):
        return text