如何使 __str__ 或 __repr__ 返回当前类的名称?

bri*_*100 3 python class python-3.x python-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
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试跑步时

emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
Run Code Online (Sandbox Code Playgroud)

我一开始只得到“员工姓名”。我如何更改它以反映“Hermoine”是 aSupervisor而不仅仅是Employee,而不重写__str____repr__方法?

U10*_*ard 9

解决方案:

尝试将您的第一堂课更改为:

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"
Run Code Online (Sandbox Code Playgroud)

尝试self.__class__.__name__代替__class__.__name__所有字符串。

现在:

emp1 = Employee("Ron", 1000, "male")
emp10 = Supervisor("Hermoine", 3000, "female", "General")
print(emp1, emp10)
Run Code Online (Sandbox Code Playgroud)

输出:

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"
Run Code Online (Sandbox Code Playgroud)

解释:

之所以self返回实际的类名是因为它会从当前实例中提取类名self。没有的self话只会得到原始父类的类名,而不是它当前所在的实际类,这就是原因self如此重要。

另外,正如 @MadPhysicist 提到的,它“因为__class__在类执行时在词法范围内”。

  • 因为 `__class__` 在类执行时被词法挖掘:即,它是一个硬编码的 `Emplpyee` 引用 (4认同)