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

本文探讨了在Python中如何避免因子类访问基类的私有属性(如__name)引发的AttributeError。讲解了私有属性的规则、操作限制以及如何通过get和set方法在子类中正确处理这些属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错

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方法。子类的对象调用也是,一般对私有属性的操作定义在普通方法里,然后子类对象调用普通方法,进行实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值