生活中的继承,一般指的是子女继承父辈的财产。
class 类名: 代码 ......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()查看某个类的继承关系
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()......# 一次性调用父类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 条评论) “” |