如何让 __str__ 或 __repr__ return 成为当前 class 的名字?
How can I make __str__ or __repr__ return the current class's name?
我有这个代码:
class Employee:
def __init__(self, name, pay, gender):
self.name = name
self.pay = pay
self.gender = gender
def add_raise(self):
self.pay = int(self.pay*1.10)
def __str__(self):
if self.gender == "Female" or self.gender == "female":
return f"{__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
def __repr__(self):
if self.gender == "Female" or self.gender == "female":
return f"{__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
class Supervisor(Employee):
def __init__(self, name, pay, gender, department):
super().__init__(name, pay, gender)
self.department = department
现在,当我尝试 运行
emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
我只得到“员工姓名”开头。我如何更改它以反映“Hermoine”是一个 Supervisor
而不仅仅是一个 Employee
,而不重写 __str__
和 __repr__
方法?
解决方案:
尝试将您的第一个 class 更改为:
class Employee:
def __init__(self, name, pay, gender):
self.name = name
self.pay = pay
self.gender = gender
def add_raise(self):
self.pay = int(self.pay*1.10)
def __str__(self):
if self.gender == "Female" or self.gender == "female":
return f"{self.__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{self.__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
def __repr__(self):
if self.gender == "Female" or self.gender == "female":
return f"{self.__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{self.__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
尝试在所有字符串中使用 self.__class__.__name__
而不是 __class__.__name__
。
现在:
emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
输出:
Employee name: Ron, and he earns 1000 Pound Supervisor name: Hermoine, and she earns 3000 Pound
解释:
self
returns 实际 class 名称的原因是因为它将从当前 self
实例中提取 class 名称。没有 self
只会得到原始父 class 的 class 名称,而不是它当前所在的实际 class,这就是 self
如此重要的原因。
正如@MadPhysicist 提到的那样,这是“因为 __class__
在 class 执行时的词法作用域”。
我有这个代码:
class Employee:
def __init__(self, name, pay, gender):
self.name = name
self.pay = pay
self.gender = gender
def add_raise(self):
self.pay = int(self.pay*1.10)
def __str__(self):
if self.gender == "Female" or self.gender == "female":
return f"{__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
def __repr__(self):
if self.gender == "Female" or self.gender == "female":
return f"{__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
class Supervisor(Employee):
def __init__(self, name, pay, gender, department):
super().__init__(name, pay, gender)
self.department = department
现在,当我尝试 运行
emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
我只得到“员工姓名”开头。我如何更改它以反映“Hermoine”是一个 Supervisor
而不仅仅是一个 Employee
,而不重写 __str__
和 __repr__
方法?
解决方案:
尝试将您的第一个 class 更改为:
class Employee:
def __init__(self, name, pay, gender):
self.name = name
self.pay = pay
self.gender = gender
def add_raise(self):
self.pay = int(self.pay*1.10)
def __str__(self):
if self.gender == "Female" or self.gender == "female":
return f"{self.__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{self.__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
def __repr__(self):
if self.gender == "Female" or self.gender == "female":
return f"{self.__class__.__name__} name: {self.name}, and she earns {self.pay} Pound"
else:
return f"{self.__class__.__name__} name: {self.name}, and he earns {self.pay} Pound"
尝试在所有字符串中使用 self.__class__.__name__
而不是 __class__.__name__
。
现在:
emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
输出:
Employee name: Ron, and he earns 1000 Pound Supervisor name: Hermoine, and she earns 3000 Pound
解释:
self
returns 实际 class 名称的原因是因为它将从当前 self
实例中提取 class 名称。没有 self
只会得到原始父 class 的 class 名称,而不是它当前所在的实际 class,这就是 self
如此重要的原因。
正如@MadPhysicist 提到的那样,这是“因为 __class__
在 class 执行时的词法作用域”。