前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >面向对象-继承与多态

面向对象-继承与多态

作者头像
星哥玩云
发布2022-09-08 13:14:15
3780
发布2022-09-08 13:14:15
举报
文章被收录于专栏:开源部署

一、继承的概念

11、继承.png
11、继承.png

二、单继承的实现

人类(person.py)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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()

三、重写

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

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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)

代码语言:javascript
复制
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并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用

优点

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

查看父类元组

代码语言:javascript
复制
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类动态添加父类

代码语言:javascript
复制
#定义一个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

代码语言:javascript
复制
class Cat(object):
    def __init__(self, name):
        self.name = name
    def eat(self):
        print("%s在吃饭"%(self.name))

dog.py

代码语言:javascript
复制
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Dog</span><span class="hljs-params">(object)</span>:</span>
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, name)</span>:</span>
        self.name = name
    <span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">eat</span><span class="hljs-params">(self)</span>:</span>
        print(<span class="hljs-string">"%s在吃饭"</span>%(self.name))

main.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
    cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
    dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
   
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()

再添加100种动物,也都是有name属性与eat方法

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

animal.py

代码语言:javascript
复制
class Animal(object):
    def __init__(self, name):
        self.name = name
    def eat(self):
        print("%s在吃饭"%(self.name))

dog.py

代码语言:javascript
复制
from animal import Animal

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

cat.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> animal <span class="hljs-keyword">import</span> Animal
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Cat</span><span class="hljs-params">(Animal)</span>:</span>
    <span class="hljs-comment"># def __init__(self, name):</span>
    <span class="hljs-comment">#     self.name = name</span>
    <span class="hljs-comment"># def eat(self):</span>
    <span class="hljs-comment">#     print("%s在吃饭"%(self.name))</span>
    <span class="hljs-keyword">pass</span>

main.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
    cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
    dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)
   
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()

定义一个人类,带有feedCat与feedDog方法可以喂猫狗

person.py

代码语言:javascript
复制
class Person(object):
    def feedCat(self, cat):
        cat.eat()
    def feedDog(self, dog):
        dog.eat()

main.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> person <span class="hljs-keyword">import</span> Person
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
    per = Person()

    cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
    dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)

    per.feedCat(cat)
    per.feedDog(dog)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()

人要喂100种动物,难道要写100个feedXXX吗?

person.py

代码语言:javascript
复制
class Person(object):
    # def feedCat(self, cat):
    #     cat.eat()
    # def feedDog(self, dog):
    #     dog.eat()

    def feedAnimal(self, ani):
        ani.eat()

main.py

代码语言:javascript
复制
<span class="hljs-keyword">from</span> person <span class="hljs-keyword">import</span> Person
<span class="hljs-keyword">from</span> cat <span class="hljs-keyword">import</span> Cat
<span class="hljs-keyword">from</span> dog <span class="hljs-keyword">import</span> Dog

<span class="hljs-comment">#多态:一种事物的多种形态</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">main</span><span class="hljs-params">()</span>:</span>
    per = Person()

    cat = Cat(<span class="hljs-string">"lele"</span>, <span class="hljs-number">8</span>)
    dog = Dog(<span class="hljs-string">"huanhuan"</span>, <span class="hljs-number">4</span>)

    <span class="hljs-comment"># per.feedCat(cat)</span>
    <span class="hljs-comment"># per.feedDog(dog)</span>
    <span class="hljs-comment"># 人要喂养100种动物</span>
    per.feedAnimal(cat)
    per.feedAnimal(dog)

<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">"__main__"</span>:
    main()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、继承的概念
  • 二、单继承的实现
  • 三、重写
  • 四、多继承的实现
  • 五、Mixin
  • 六、多态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档