在学到继承时,python规定私有属性不能继承。
但是,在通过访问公有方法(从父类继承)来访问父类私有属性时却形成了,子类可以继承父类私有属性的现象。
代码:
# encoding = utf-8
class Person(object):
def __init__(self, name, age):
self.name = name
self.__age = age # 定义私有变量 __age
print(self.__age) # 创建子类对象时,__age仍被赋值
def get___age(self): # 定义获取 __age 的公有方法
return self.__age
def set___age(self, age): # 定义设置 __age 的共有方法
self.__age = age
class Student(Person):
pass # Student没有显式定义任何属性和方法
tom = Student("tom", 18)
print("tom年龄:" + str(tom.get___age()))
tom.set___age(20)
print("tom年龄:" + str(tom.get___age()))
运行结果:
18
tom年龄:18
tom年龄:20
子类没有继承父类的私有属性 __age
但是,子类继承了父类的 init()方法,如果子类没有复写该方法
当创建子类对象时,仍然需要传入一个值代表age,然后这个值被赋给 __age
并且通过 get___age() / set___age() 两个方法也能 获取/设置 Student中不存在,但是确实存在的”父类的私有属性”
写到这,脑子里突然闪出另一个想法:
这是前文的init()方法:
def __init__(self, name, age):
self.name = name
self.__age = age # 定义私有变量 __age
print(self.__age) # 创建子类对象时,__age仍被赋值
我理解的继承是:
父类的代码,子类不需要再写,只需要调用即可
也就是说这段代码子类也相当于拥有
所以我的想法是:
当子类拥有这段代码后(即继承后)
self.__age = age # 定义私有变量 __age
是不是这条语句使得子类中自定义了一个私有属性 __age?
于是我在子类中添加了一个方法(其他代码没做改动)
class Student(Person):
def print_info(self):
print(self.name)
print(self.__age)
在程序最后面添加:
tom.print_info()
运行结果:(省略了出错路径的提醒)
18
tom年龄:18
tom年龄:20
tom
AttributeError: 'Student' object has no attribute '_Student___age'
明显,跟我这个想法所预料的结果不一样
按照我的这个想法,不会报错,而且输出是这样的:
18
tom年龄:18
tom年龄:20
tom
20
由此说明,想法错误,子类继承父类的init()方法,方法中定义属性的语句,对子类没有用
回到主题,照目前情形而言,虽然子类不能继承父类的私有属性,但是通过父类的
init()方法、getter、setter方法可以造成子类拥有了父类私有属性的现象