我有这段代码:
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”
。 - chepnerclass
语句命名空间中直接使用类属性role =“Employee”
。) - chepnerself.__class__.__name__
方法是__repr__
方法的一个非常常见的模式。例如,请参见collections.OrderedDict
、collections.Counter
、collections.namedtuple
和collections.ChainMap
。https://github.com/python/cpython/blob/main/Lib/collections/__init__.py - Alex Waygoodstr
。对于仅用作调试工具的repr
来说还好。对于__str__
,我宁愿使用显式数据而不是从 代码 推断出的值。 - chepner__repr__
方法通常是这样的,并且将__str__
未定义(这意味着对__str__
的调用将回退到__repr__
方法)。我也不完全确定为什么您不认为类名是显式数据——在运行时动态设置或修改类名非常罕见。 - Alex Waygood