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

面向对象-继承与多态

129次阅读
没有评论

共计 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、短信等云产品特惠热卖中