如何让Python的__str__与__repr__方法返回当前类名?子类无需重写方法实现类名正确显示
解决方法:用
self.__class__.__name__代替__class__.__name__ 你遇到的问题根源很明确:在Employee类的__str__和__repr__方法里,你用了__class__.__name__——但在实例方法中,__class__指向的是定义这个方法的类(也就是Employee),不管你的实例是子类Supervisor的对象,它都会硬输出Employee。
只需要把这两个方法里的__class__.__name__替换成self.__class__.__name__,就能让输出自动识别实例实际所属的类,完全不需要在Supervisor里重写这两个方法。
修改后的Employee类相关方法如下:
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"
现在运行你的测试代码:
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
另外给你提个小优化建议:把性别判断的逻辑抽成一个辅助方法,避免__str__和__repr__里的重复代码,让代码更简洁易维护:
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 _get_pronoun(self): return "she" if self.gender.lower() == "female" else "he" def __str__(self): return f"{self.__class__.__name__} name: {self.name}, and {self._get_pronoun()} earns {self.pay} Pound" def __repr__(self): # 直接复用__str__的逻辑,减少重复 return self.__str__()
这样改动后,功能完全不变,但代码结构更清晰,后续如果要调整性别判断逻辑,只需要改_get_pronoun一个地方就好。
内容的提问来源于stack exchange,提问作者brightstar2100
相关产品推荐
相关产品推荐

