【发布时间】:2021-11-06 02:30:30
【问题描述】:
我有这个代码:
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__ 方法?
【问题讨论】:
-
老实说,我会在实例属性中明确“角色”,而不是尝试重用类名。在适当的
__init__方法中添加self.role = "Employee或self.role = "Supervisor"。 -
(或类属性,
role = "Employee"直接在class语句命名空间中。) -
@chepner,@U12-Forward 建议的
self.__class__.__name__方法是__repr__方法的一种非常常见的模式。例如,参见collections.OrderedDict、collections.Counter、collections.namedtuple和collections.ChainMap。 github.com/python/cpython/blob/main/Lib/collections/__init__.py -
这不是我喜欢的,尤其是
str。repr很好,无论如何它只是用作调试工具。对于__str__,我宁愿使用显式数据而不是从 code 推断出的值。 -
好吧,很公平——但我认为有必要注意,标准库中定义这样的
__repr__方法可以说是规范,而将__str__保留为未定义(意味着调用__str__将退回到__repr__方法)。我也不完全确定您为什么不将类名视为显式数据——在运行时动态设置或修改类名的情况很少见。
标签: python python-3.x class python-class