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