NameError: name ‘self’ is not defined in Python [已解决]

NameError: name ‘self’ 未在 Python 中定义[已解决]

NameError: name ‘self’ is not defined in Python [Solved]

出现“NameError: name ‘self’ is not defined”的原因有多种:

  1. self忘记在方法中指定参数。
  2. 尝试在方法参数中用作self.attribute默认值。
  3. 试图访问self方法之外。

nameerror name self 未定义

下面是错误如何发生的示例。

主程序
class Employee(): def __init__(self, first, last=self.first): self.first = first self.last = last # ⛔️ NameError: name 'self' is not defined bob = Employee('bobby', 'hadz')

使用 self 作为默认参数

问题是我们self在方法定义中将参数用作默认值。

Python 中的默认参数是在定义函数时计算的,但是,self参数是表示调用方法的实例的参数,因此它仅在调用方法时可用。

在方法的定义中指定一个默认值

如果这是您收到错误的原因,请改为在方法的定义中指定一个默认值。

主程序
class Employee(): def __init__(self, first, last=None): self.first = first if last is None: self.last = self.first bob = Employee('bobby') print(bob.first) # 👉️ bobby print(bob.last) # 👉️ bobby

在方法定义中指定默认值

我们检查last参数是否为 None,如果是,我们将其设置为first参数的值。

self尝试在方法之外访问

如果您尝试在方法之外访问self,您也可能会遇到错误

主程序
class Employee(): # ⛔️ NameError: name 'self' is not defined self.salary = 123 def __init__(self, first, last=None): self.first = first self.last = last bob = Employee('bobby')

访问自我外部方法

self我们试图在导致错误的方法之外的类中直接访问。

self.不使用前缀声明类变量

如果您打算声明一个类变量,请省略self.前缀。

主程序
class Employee(): # 👇️ declare class variable default_salary = 123 def __init__(self, first, last): self.first = first self.last = last alice = Employee('alice', 'smith') bob = Employee('bobby', 'hadz') print(alice.default_salary) # 👉️ 123 print(bob.default_salary) # 👉️ 123

声明类变量

该类具有default_salary类变量和first实例last变量。

类变量由所有实例共享,可以直接在类上访问,例如Employee.default_salary.

实例变量对于您通过实例化类创建的每个实例都是唯一的。

常规方法会传递一个self对象,该对象为我们提供对调用该方法的实例的引用。

忘记指定self为使用它的方法的参数

错误的另一个常见原因是忘记指定self为使用它的方法的参数。

确保self在所有使用它的类方法中指定为第一个参数。

主程序
class Employee(): default_salary = 123 def __init__(self, first, last): self.first = first self.last = last # 👇️ specify self as first argument def greet(self, greet): return greet + self.first + ' ' + self.last alice = Employee('alice', 'smith') bob = Employee('bobby', 'hadz') print(alice.greet('hi ')) # 👉️ hi alice smith print(bob.greet('hey ')) # 👉️ hey bobby hadz print(alice.default_salary) # 👉️ 123 print(bob.default_salary) # 👉️ 123

实例变量对于每个实例都是唯一的,但实例共享相同的类first变量lastdefault_salary

请注意,参数的名称self只是一种约定。实际上,您可以使用任何其他名称,例如this.

但是,不建议这样做,因为大多数(如果不是全部)Python 开发人员都遵循该约定,不遵循它会使您的代码更加混乱和难以阅读。

结论

要解决“NameError: name ‘self’ is not defined”,请确保:

  1. self您没有忘记在方法中指定参数。
  2. 您还没有self在方法之外访问过。
  3. 您没有将该self参数用作方法中另一个参数的默认值。