在方法默认参数中使用self的方法?

时间:2017-10-16 13:20:40

标签: python

对于类的方法,我想要以下行为

>>class A:
>>    def __init__(self, x):
>>        self.x = x
>>    def func(self, x = self.x):
>>        print(x)
>>a = A(5)
>>a.func(2)
2
>>a.func()
5

但是我在func()

的声明中遇到了这个错误
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 4, in A
NameError: name 'self' is not defined

是否有推荐的方法来实现此行为?

2 个答案:

答案 0 :(得分:3)

使用哨兵值; None通常就足够了。

class A:
    def __init__(self, x):
        self.x = x
    def func(self, x=None):
        if x is None:
            x = self.x
        print(x)

如果出于某种原因,None可能是一个有效的参数,你可以创建自己的哨兵。

_sentinel = object()
class A:
    def __init__(self, x):
        self.x = x
    def func(self, x=_sentinel):
        if x is _sentinel:
            x = self.x
        print(x)

答案 1 :(得分:2)

您不能在函数声明中引用self,因为此时self确实不存在(如错误所示)。惯用的方式是:

def func(self, x = None):
    if x is None:
        x = self.x
    print(x)

或者也许:

def func(self, x = None):
    print(x or self.x)

(虽然请注意 falsey None不同,因此可能会有不同的行为。)