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


    报错

    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()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    报错如下:

    <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'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    解决

    私有属性:

     1、父类的私有属性,私有方法不能被子类继承
    
     2、子类对象不能调用父类的私有方法和私有属性,只能调用普通属性和普通方法
    
     3、子类继承父类,子类对象虽然不能调用,但是在子类里的方法里可以实现对私有属性的修改获取通过get__xx()方法,修改值是set__xx()方法
    
     4、对私有属性的操作,只能在当前类中也即父类里,像get__xx()方法均是定义在父类里
    
     5、私有属性的书写,以及私有办法的书写,就是在前面加__
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

  • 相关阅读:
    【iOS】—— KVC
    探索经典算法:贪心、分治、动态规划等
    亚马逊---设计安全架构
    2022年10月中旬刷题记录
    ZooKeeper系列:实现分布式锁
    web前端期末大作业 基于HTML+CSS+JavaScript程序员个人博客模板(web学生作业源码)
    python中布隆过滤器用法详解
    nginx主机黑白名单[geoip]
    【Note17】PECI(Platform Environment Control Interface)
    新版DBeaver调整编辑窗口字体大小
  • 原文地址:https://blog.csdn.net/everysigleday/article/details/127773019