当前位置: 首页 > 工具软件 > Object Bot > 使用案例 >

AttributeError: ‘Manager‘ object has no attribute ‘_Manager__name‘

奚光霁
2023-12-01

报错

class Employee:

    def __init__(self, name, salary):
        self.__name = name
        self.__salary = salary

    def print_info(self):
        print(self.__name, self.__salary)

    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

class Manager(Employee):
    
    def __init__(self, name, salary, level, employees):
        super().__init__(name, salary)
        self.__level = level
        self.__employees = employees

    def print_info(self):
        print(self.__name, self.__salary, self.__level, self.__employees)

    def get_level(self):
        return self.__level


m = Manager('Karl', 4000, 2, ['Liz', 'Jack', 'Kim'])
m.print_info()

报错如下:

<ipython-input-52-e149c184176c> in print_info(self)
     22 
     23     def print_info(self):
---> 24         print(self.__name, self.__salary, self.__level, self.__employees)
     25 
     26     def get_level(self):

AttributeError: 'Manager' object has no attribute '_Manager__name'

合理猜测是因为__name是基类中的私有方法,而派生类访问了基类的私有方法引起报错

解决

私有属性:

 1、父类的私有属性,私有方法不能被子类继承

 2、子类对象不能调用父类的私有方法和私有属性,只能调用普通属性和普通方法

 3、子类继承父类,子类对象虽然不能调用,但是在子类里的方法里可以实现对私有属性的修改获取通过get__xx()方法,修改值是set__xx()方法

 4、对私有属性的操作,只能在当前类中也即父类里,像get__xx()方法均是定义在父类里

 5、私有属性的书写,以及私有办法的书写,就是在前面加__

综上:对私有属性和私有方法的操作,必须定义在父类中。子类想要获取,或者修改必须通过get__xx和set__xx方法。子类的对象调用也是,一般对私有属性的操作定义在普通方法里,然后子类对象调用普通方法,进行实现。

 类似资料: