抽象方法和自变量以及 NameError

abstract method and self variable and NameError

我将向您展示 2 段代码:

from abc import ABC, abstractmethod
class AbstractEmployee(ABC):
  new_id = 1
  def __init__(self):
    self.id = AbstractEmployee.new_id
    AbstractEmployee.new_id += 1

  @abstractmethod
  def say_id(self):
    pass

# Write your code below
class Employee(AbstractEmployee):
    def say_id(self):
      print('Sim, o ID dele é {}'.format(self.id))

e1 = Employee()
e1.say_id()

输出:Sim, o ID dele é 1

第二个密码:

from abc import ABC, abstractmethod

class AbstractEmployee(ABC):
  new_id = 1
  def __init__(self):
    self.id = AbstractEmployee.new_id
    AbstractEmployee.new_id += 1

  @abstractmethod
  def say_id(self):
    pass

# Write your code below
class Employee(AbstractEmployee):
    # def say_id(self): do not use say_id
    print('Sim, o ID dele é {}'.format(self.id))

e1 = Employee()
e1.say_id()

输出:NameError:名称'self'未定义

为什么我会收到这个 NameError?我想既然我在classEmployee中继承了AbstractEmployee,我不应该能够从AbstractEmployeeclass访问self.id吗?为什么我能 在第一段代码中访问它并打印 'Sim, o ID dele é 1' 而不是在第二个?

我将添加第三段代码,但我仍然遇到相同的错误,即使我删除了抽象方法:

class AbstractEmployee:
  new_id = 1
  def __init__(self):
    self.id = AbstractEmployee.new_id
    AbstractEmployee.new_id += 1

  def say_id(self):
    pass

# Write your code below
class Employee(AbstractEmployee):
    # def say_id(self):
  print('Sim, o ID dele é {}'.format(self.id))

e1 = Employee()
e1.say_id()

输出:NameError:名称'self'未定义

您的第二个版本在将您的 class 定义解析为字节码时发现错误。

在示例 2 中,如果您更改代码以完全避免引用 self,

print('Sim, o ID dele é XX')

然后你会得到一个新的错误:

TypeError: Can't instantiate abstract class Employee with abstract method say_id

要覆盖抽象方法,您需要在子class 中重新定义该方法。

更一般地说,self 没有什么特别之处——Python 总是向方法提供对方法所属对象的引用。你可以随意称呼它。例如:

class NamedPerson:
    def __init__(joker,name):
        joker.name = name

    def get_name(bill):
        print(bill.name)

person = NamedPerson("Carl")
person.get_name()

您将得到输出“Carl”。

方法的第一个参数的变量 self 被 Python 社区很好地遵守,以至于很容易将其误认为关键字,例如 this Java,这是一个始终指向调用它的对象的关键字。

您正在尝试像 Java 用户使用 this 那样使用 self,但这不是 Python 的设计方式。