没有定义 name‘ self’

为什么是这样的结构

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


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

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

232843 次浏览

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

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

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

更新2022: Python 开发人员现在是未来 Python 版本的 考虑后期限制参数默认值

如你同时希望选择将「 b 」设定为「无」 :

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

如果未能在方法签名中定义 self,也可能发生 self NameError。此错误通常显示为 TypeError,因为预期参数和给定参数之间存在不匹配[1]。但是,如果接受数量可变的参数,那么 self将是 arg[0],而变量 self将是未定义的。

举个小例子。

class Obj:
def foo(*args):
print(self.bar)

> NameError: 没有定义 name‘ self’

更正:

class Obj:
def baz(self, *args):
print(self.bar)

[1] http://neopythonic.blogspot.com/2008/10/why-explicit-self-has-to-stay.html