抽象方法和自变量以及 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 的设计方式。
我将向您展示 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 的设计方式。