阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

面向对象-继承与多态

396次阅读
没有评论

共计 4903 个字符,预计需要花费 13 分钟才能阅读完成。

一、继承的概念

面向对象 - 继承与多态

二、单继承的实现

  • 人类(person.py)

  • class Person(object): def __init__(self, name, age, sex, money): self.name = name self.age = age self.sex = sex # 私有属性 self.__money = money @property def money(self): return self.__money @money.setter def money(self, value): self.__money = value def run(self): print("---------run")
  • 学生类(student.py)

    from person import Person class Student(Person): def __init__(self, name, age, sex, money, stuId): # 调用父类中的__init__函数 super().__init__(name, age, sex, money) # 增加独有属性 self.stuId = stuId # 增加独有的方法 def say(self): print("---------say") # 重写 run 方法 def run(self): print("student run") super().run()# 执行父类中的方法 (原功能)
  • 工人类(worker.py)

    from person import Person class Worker(Person): def __init__(self, name, age, sex, money, gl): super().__init__(name, age, sex, money) self.gl = gl def talk(self): print("---------talk")
  • 主文件(main.py)

    from student import Student from worker import Worker def main(): stu1 = Student("dily", 30, "男", 100, 1) wor1 = Worker("wangbw", 40, "男", 200, 20) # 方法的使用原理:当对象调用方法时,首先现在本类中查找同名方法,找到了就用,找不到去直接父类中查找,父类中有就用,没有的话再去上一级父类中查找,直到找到 object 中截止,在哪里找到就用哪里方法。如果没有没有找到那么就报错说明没有该方法 stu1.run() wor1.run() stu1.say() wor1.talk() # 私有属性可以被继承 print("---------", stu1.money) if __name__ == "__main__": main()

三、重写

目的:将继承的方法重写一遍,在原有的功能基础上可以添加一些新的功能

class Person(object): # 重写:将继承的方法重写一遍,在原有的功能基础上可以添加一些新的功能 def __init__(self, name, age): self.name = name self.age = age # 在用户调用 print 打印该类型的对象时 # 显示给用户的 def __str__(self): return "1-name:%s,age:%d"%(self.name, self.age) # 是给机器用的,在 python 解释器里直接敲对象时被调用 def __repr__(self): return "2-name:%s,age:%d" % (self.name, self.age) per = Person("liudh", 55) print(per) # print(per.name, per.age)

四、多继承的实现

  • 加法类(add.py)

    class Add(object): def __init__(self, m, n, a): self.m = m self.n = n self.a = a def sum(self, x, y): return x + y def say(self): print("sunck is a good man")
  • 减法类(sub.py)

    class Sub(object): def __init__(self, m, n, b): self.m = m self.n = n self.b = b def sub(self, x, y): return x - y def say(self): print("sunck is a nice man")
  • 计算器类(calculate.py)

    from add import Add from sub import Sub # 多继承:在小括号中依次写入父类 class Calculate(Add, Sub): def __init__(self, m, n, a, b): Add.__init__(self, m, n ,a) Sub.__init__(self, m, n ,b)
  • 主文件(main.py)

    from calculate import Calculate def main(): c = Calculate(1,2,3,4) print(c.m) print(c.n) print(c.a) print(c.b) # 父类中的方法名相同,默认调用的是括号中排名靠前的父类中的方法 c.say() if __name__ == "__main__": main()

五、Mixin

  • 概念

    Mixin 编程是一种开发模式,是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常 mixin 并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用

  • 优点

    • 以在不修改任何源代码的情况下,对已有类进行扩展
    • 可以保证组件的划分
    • 可以根据需要,使用已有的功能进行组合,来实现“新”类
    • 很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类
  • 查看父类元组

    class Person(object): def __init__(self, name, age): self.name = name self.age = age def say(self): print("%s is a good man"%(self.name)) class A(object): pass class Worker(Person, A): def __init__(self, name, age, gl): super().__init__(name, age) self.gl = gl # 是元组类型,里面的每个元素是该类的父类 print(Worker.__bases__)
  • 使用 Mixin 类动态添加父类

    # 定义一个 Mixin 类,一般省略 object class FixMixin(): def fixPhone(self): print("修手机") def fixComputer(self): print("修电脑") class Person(object): def __init__(self, name, age): self.name = name self.age = age def say(self): print("%s is a good man"%(self.name)) class Student(Person): def __init__(self, name, age, stuId): super().__init__(name, age) self.stuId = stuId # 给 pyClass 动态添加父类 pyMixinClass,flag 为真时可以明确 pyMixinClass 不在 pyClass.__bases__中,否则需要 mixin 函数自己去判断 def mixin(pyClass, pyMixinClass, flag=0): if flag: pyClass.__bases__ += (pyMixinClass,) if pyMixinClass not in pyClass.__bases__: pyClass.__bases__ += (pyMixinClass,) # 将 FixMixin 类动态设置为 Student 的父类 mixin(Student, FixMixin, 0) stu = Student("dily", 18, 1) stu.say() stu.fixPhone()

六、多态

概念:一种事物的多种形态

终极目标:人可以喂任何一种动物

  • 定义出两个类 (猫、狗),分别带有 name 属性与 eat 方法

    cat.py

    class Cat(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))

    dog.py

    class Dog(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))

    main.py

    from cat import Cat from dog import Dog def main(): cat = Cat("lele", 8) dog = Dog("huanhuan", 4) if __name__ == "__main__": main()
  • 再添加 100 种动物,也都是有 name 属性与 eat 方法

    定义一个 Animal 类,带有 name 属性与 eat 方法,让猫、狗等动物都继承自 Animal 类

    animal.py

    class Animal(object): def __init__(self, name): self.name = name def eat(self): print("%s 在吃饭"%(self.name))

    dog.py

    from animal import Animal class Dog(Animal): # def __init__(self, name): # self.name = name # def eat(self): # print("%s 在吃饭"%(self.name)) pass

    cat.py

    from animal import Animal class Cat(Animal): # def __init__(self, name): # self.name = name # def eat(self): # print("%s 在吃饭"%(self.name)) pass

    main.py

    from cat import Cat from dog import Dog def main(): cat = Cat("lele", 8) dog = Dog("huanhuan", 4) if __name__ == "__main__": main()
  • 定义一个人类,带有 feedCat 与 feedDog 方法可以喂猫狗

    person.py

    class Person(object): def feedCat(self, cat): cat.eat() def feedDog(self, dog): dog.eat()

    main.py

    from person import Person from cat import Cat from dog import Dog def main(): per = Person() cat = Cat("lele", 8) dog = Dog("huanhuan", 4) per.feedCat(cat) per.feedDog(dog) if __name__ == "__main__": main()
  • 人要喂 100 种动物,难道要写 100 个 feedXXX 吗?

    person.py

    class Person(object): # def feedCat(self, cat): # cat.eat() # def feedDog(self, dog): # dog.eat() def feedAnimal(self, ani): ani.eat()

    main.py

    from person import Person from cat import Cat from dog import Dog # 多态:一种事物的多种形态 def main(): per = Person() cat = Cat("lele", 8) dog = Dog("huanhuan", 4) # per.feedCat(cat) # per.feedDog(dog) # 人要喂养 100 种动物 per.feedAnimal(cat) per.feedAnimal(dog) if __name__ == "__main__": main()

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-05-26发表,共计4903字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7796011
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个AI智能体—跟创业大佬对话

自己手撸一个 AI 智能体 — 跟创业大佬对话 前言 智能体(Agent)已经成为创业者和技术人绕...
星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛NAS-14:解锁公网自由!Lucky功能工具安装使用保姆级教程

星哥带你玩飞牛 NAS-14:解锁公网自由!Lucky 功能工具安装使用保姆级教程 作为 NAS 玩家,咱们最...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...