组团学

面向对象-继承与多态

阅读 (201302)

一、继承的概念

11、继承.png

二、单继承的实现

  • 人类(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()
需要 登录 才可以提问哦