NameError: name ‘self’ 未在 Python 中定义[已解决]
NameError: name ‘self’ is not defined in Python [Solved]
出现“NameError: name ‘self’ is not defined”的原因有多种:
self
忘记在方法中指定参数。- 尝试在方法参数中用作
self.attribute
默认值。 - 试图访问
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
在方法定义中将参数用作默认值。
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
变量。last
default_salary
请注意,参数的名称self
只是一种约定。实际上,您可以使用任何其他名称,例如this
.
但是,不建议这样做,因为大多数(如果不是全部)Python 开发人员都遵循该约定,不遵循它会使您的代码更加混乱和难以阅读。
结论
要解决“NameError: name ‘self’ is not defined”,请确保:
self
您没有忘记在方法中指定参数。- 您还没有
self
在方法之外访问过。 - 您没有将该
self
参数用作方法中另一个参数的默认值。