【发布时间】:2021-10-17 14:42:50
【问题描述】:
我给你看两段代码:
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: name 'self' is not defined
为什么我会得到这个 NameError?我想既然我在Employee类中继承了AbstractEmployee,我不应该能够从AbstractEmployee类中访问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: name 'self' is not defined
【问题讨论】:
-
您为什么认为
self会在该类块中的任何位置定义? -
如果
print()不在say_id()方法定义中,则调用它的时间点与调用e1.say_id()的时间点完全无关。事实上,它发生在在Employee类的定义期间 - 甚至还没有该类的实例存在,因此没有要打印的 id。 -
@jasonharper 但是因为我继承了 AbstractEmployee 它不应该工作吗?
-
我刚刚在 Pythontutor 上运行了第三个代码,当 Python 读取 Employee 类时它崩溃了:tinyurl.com/ykd35sff
-
继承与此完全无关。
print()不在方法中,因此它在类定义期间被调用。
标签: python oop abstract-class self