Python - 继承

继承的概念

生活中的继承,一般指的是子女继承父辈的财产。

  • 拓展1:经典类或旧式类
class 类名:    代码    ......
  • 拓展2:新式类
class 类名(object):    代码

python面向对象的继承指的是多个类之间的所属关系,即子类默认继承父类的所有属性的方法,具体如下:

class A(object):    def __init__(self):        self.num = 1    def info_print(self):        print(self.num)class B(A):    passresult = B()result.info_print()

在python中,所有类默认继承object类,object类是顶级类或基类;其他子类叫做派生类。

单继承

故事主线:一个煎饼果子老师傅,在煎饼果子界摸爬滚打多年,研发了一套精湛的摊煎饼果子的技术。师父要把这套技术传授给他的唯一的最得意的徒弟。

分析:徒弟是不是要继承师父的所有技术?

class Master(object):    def __init__(self):        self.kongfu = '[古法煎饼果子配方]'    def make_cake(self):        print(f'运用{self.kongfu}制作煎饼果子')class Prentice(Master):    passjack = Prentice()print(jack.kongfu)jack.make_cake()

多继承

故事推进:jack是个爱学习的好孩子,想学习更多的煎饼果子技术,于是,在百度找到了一个培训班,报班学习煎饼果子技术。

所谓多继承意思就是一个类同时继承多个父类

class Master(object):    def __init__(self):        self.kongfu = '[古法煎饼果子配方]'    def make_cake(self):        print(f'运用{self.kongfu}制作煎饼果子')class School(object):    def __init__(self):        self.kongfu = '[清华煎饼果子配方]'    def make_cake(self):        print(f'运用{self.kongfu}制作煎饼果子')class Prentice(School, Master):    passjack = Prentice()print(jack.kongfu)jack.make_cake()

当一个类有多个父类的时候,默认使用第一个父类的同名属性和方法。

子类重写父类同名方法和属性

故事:jack掌握了师父和培训技术后,自己潜心钻研出自己的独门配方。

......class Prentice(School, Master):    def __init__(self):        self.kongfu = '[独门秘籍]'    def make_cake(self):        print(f'运用{self.kongfu}制作煎饼果子')jack = Prentice()print(jack.kongfu)jack.make_cake()

__mro__

查看某个类的继承关系

print(Prentice.__mro__)

子类调用父类的同名方法和属性

故事:很多顾客都希望能吃到百度技术的煎饼果子

......class Prentice(School, Master):    def __init__(self):        self.kongfu = '[独门秘籍]'    def make_cake(self):        # 如果是先调用了父类的属性和方法,父类属性会覆盖子类属性,故在调用属性前,        # 先调用自己子类的初始化        self.__init__()        print(f'运用{self.kongfu}制作煎饼果子')    # 调用父类方法,但是为保证调用到的也是父类的属性,必须在调用方法前调用父类的初始化    def make_master_cake(self):        Master.__init__(self)        Master.make_cake(self)    def make_school_cake(self):        School.__init__(self)        School.make_cake(self)jack = Prentice()jack.make_cake()jack.make_master_cake()jack.make_school_cake()

多层继承

故事:N年后,jack老了,想要把所有技术传承给自己的徒弟。

......# 徒孙类class Tusun(Prentice):    passxiaoqiu = Tusun()xiaoqiu.make_cake()xiaoqiu.make_master_cake()xiaoqiu.make_school_cake()

super()调用父类方法

......# 一次性调用父类School Master的方法    def make_old_cake(self):        # 方法一:如果定义的类名修改,这里也要修改,麻烦;冗余代码量庞大        # School.__init__(self)        # School.make_cake(self)        # Master.__init__(self)        # Master.make_cake(self)        # 方法二:        # 2.1 super(当前类型, self).函数()        # super(Prentice, self).__init__()        # super(Prentice, self).make_cake()        # 2.2 无参数super        super().__init__()        super().make_cake()jack = Prentice()jack.make_old_cake()

使用super()可以自动查找父类。调用顺序遵循__mro__类属性的顺序。比较适合单继承使用

私有权限

定义私有属性和方法

在python中,可以为实例属性和方法设置私有权限,即设置某个实例属性或实例方法不继承给子类。

故事:jack把技术传承给徒弟的同时,不想把自己的钱继承给徒弟,这个时候就要为钱这个实例属性设置私有权限。

设置私有权限的方法:在属性名和方法名前面加上两个下划线_。

class Prentice(School, Master):    def __init__(self):        self.kongfu = '[独门秘籍]'        # 私有属性        self.__money = 200000    # 私有方法    def __info_print(self):        print('这是私有方法')        print(self.__money)

获取和修改私有属性

在python中,一般定义函数名get_xx来获取私有属性,定义set_xx来修改私有属性

......class Prentice(School, Master):    def __init__(self):        self.kongfu = '[独门秘籍]'        # 私有属性        self.__money = 200000    # 获取私有属性值    def get_money(self):        return self.__money    # 修改私有属性值    def set_money(self):        self.__money = 100xiaoqiu = Tusun()print(xiaoqiu.get_money())  # 20000xiaoqiu.set_money()print(xiaoqiu.get_money())  # 100
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章