python_小白的修炼笔记_2018/1/5_私有属性可以继承的困惑

在学到继承时,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方法可以造成子类拥有了父类私有属性的现象

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值