You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 10:42:41