NameError:名称“ self”未定义


144

为什么这样的结构

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

给一个错误NameError: name 'self' is not defined

Answers:


159

默认参数值在函数定义时评估,但self仅在函数调用时可用。因此,参数列表中的参数不能相互引用。

将参数默认为默认值None并在代码中为此添加测试是一种常见的模式:

def p(self, b=None):
    if b is None:
        b = self.a
    print b

4
尽管我认为上面的内容不是很漂亮(我来自ruby,在这里一切正常,但是上面的内容实际上是一种解决方法)。python选择在参数列表中使其自身不可用仍然很尴尬。
shevy

2
@shevy:“ self”在python中没有特殊含义,它只是按惯例为第一个参数选择的名称。您也可以将“ self”替换为“ me”或“ x”。
最多

有没有更好的方法可以做到这一点?如果我们有一个带有一打应引用self的默认参数的函数,我们真的需要一打if语句吗?这很尴尬。
理查德·J·巴拉巴拉斯

16

对于您还希望将“ b”设置为“无”的情况:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

6

如果您通过Google到达这里,请确保检查是否已将self作为类函数的第一个参数。特别是如果您尝试在函数中引用该对象的值。

def foo():
    print(self.bar)

> NameError:名称“ self”未定义

def foo(self):
    print(self.bar)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.