zoukankan      html  css  js  c++  java
  • day25 面向对象继承 多态

    一、上节回顾:

       命名空间:  

          静态属性:属于类内部的命名空间

          动态属性:属于类内部的命名空间

          对象属性:属于对象的,在类内和self发生联系,在类内和对象名发生联系

          可以查看静态属性的都有哪些:类名,对象名

          可以调用类内的方法有哪些:类名.方法名(对象),对象.方法名()

          类到对象之间没有联系,而对象到类之间有联系

          对象在查找名的时候,会先在自己的空间里找,再到类的空间里找

      组合:

           将一个对象作为另一个类的对象的属性

    作业:。。。。

    二、新内容:

    1、继承:模糊到具体

      抽象:具体到模糊

      先抽象后继承

      继承有几种:单继承、多继承

    2、继承的例子(猫和狗)

    class Animal:
        def eat(self):
            print("eating")
        def drink(self):
            print("drinking")
        def sleep(self):
            print("sleeping")
    class Cat(Animal):
        def catch_mouse(self):
            print("yeah")
    class Dog(Animal):
        def watch_door(self):
            print("wangwang")
    kitty=Cat()
    kitty.eat()   #eating
    snoopy=Dog()
    snoopy.eat()   #eating
    snoopy.watch_door() #wangwang
    猫和狗的继承的例子

    3、

     

    class Animal:
        def __init__(self,name,aggressivity,life_value):
            self.name=name      #每个角色都有自己的昵称
            self.aggressivity=aggressivity  #每个角色都有自己的攻击力
            self.life_value=life_value   #每一个角色都有自己的生命值
    
        def eat(self):
            self.life_value+=10
    
    class Person(Animal):
        def __init__(self, name, aggressivity, life_value,money):
            Animal.__init__(self,name,aggressivity,life_value)
            self.money=money
    
        def attack(self,dog):
            dog.life_value-=self.aggressivity
    
        def get_weapon(self,weapon_obj):
            if self.money>weapon_obj.price:
                self.money-=weapon_obj.price  #花钱买武器
                self.weapon=weapon_obj       #装备打狗棒
                self.aggressivity+=weapon_obj.aggr  #人类的攻击力增加
    
    class Dog(Animal):
        def __init__(self, name, breed,aggressivity, life_value):
            Animal.__init__(self, name, aggressivity, life_value)
            self.breed=breed    #每一只狗都有自己的品种:#派生属性:父类没有属性
    
        def bite(self,people): #派生方法:父类没有的方法
            people.life_value -= self.aggressivity
    
    snoopy=Dog("太白","京巴",250,500)
    per=Person("taihei",100,234,100)
    print(snoopy.breed)  #京巴
    print(snoopy.name)      #太白
    snoopy.eat()
    print(snoopy.life_value)  #510
    snoopy.eat()
    print(snoopy.life_value)  #520
    Animal.eat(snoopy)          #使用父类的方法
    print(snoopy.life_value)#530
    具有相同方法的类

    4、总结:

    5、新式类:

    super 找到的是最近的父类(其他语言里面都有)

     

    class Animal:
        def __init__(self,name,aggressivity,life_value):
            self.name=name      #每个角色都有自己的昵称
            self.aggressivity=aggressivity  #每个角色都有自己的攻击力
            self.life_value=life_value   #每一个角色都有自己的生命值
    
        def eat(self):
            self.life_value+=10
    
    class Person(Animal):
        def __init__(self, name, aggressivity, life_value,money):
            # Animal.__init__(self,name,aggressivity,life_value)
            # super(Person,self).__init__(name, aggressivity, life_value)
            super().__init__(name,aggressivity,life_value)
            self.money=money
    
        def attack(self,dog):
            dog.life_value-=self.aggressivity
    
        def get_weapon(self,weapon_obj):
            if self.money>weapon_obj.price:
                self.money-=weapon_obj.price  #花钱买武器
                self.weapon=weapon_obj       #装备打狗棒
                self.aggressivity+=weapon_obj.aggr  #人类的攻击力增加
    
    class Dog(Animal):
        def __init__(self, name, breed,aggressivity, life_value):
            # Animal.__init__(self, name, aggressivity, life_value)
            super().__init__(name, aggressivity, life_value)
            self.breed=breed    #每一只狗都有自己的品种:#派生属性:父类没有属性
    
        def bite(self,people): #派生方法:父类没有的方法
            people.life_value -= self.aggressivity
        def eat(self):
            # Animal.eat(self)
            super().eat()
            print("dog is eating")
    snoopy=Dog("太白","京巴",250,500)
    super(Dog,snoopy).eat()    #Animal.eat(snoopy)
    #新式类和经典类调用父类的方法
    snoopy.eat()
    print(snoopy.life_value)    #dog is eating  520
    新式类和经典类调用父类的方法

     6、总结:

      用子类的对象,调用父类的方法

      如果子类没有这个方法,直接使用父类的

      如果子类有同名方法:

        经典类 指名道姓 类名.方法名(子类对象)类内外一致

        新式类 super方法 super(子类名,子类对象).方法名(),类内可以省略super 的参数 

    7、

    class Foo:
        def __init__(self):
            self.func()
        def func(self):
            print("Foo.func")
    class Son(Foo):
        def func(self):
            print('Son.func')
    s=Son()
    #Son.func
    面试题

    8、钻石继承

    1、经典类

    2、新式类

    3、总结 和例子

    class D(object):
        pass
        def f(self):
            print("D")
    class B(D):
        pass
        def f(self):
            print('B')
    class C(D):
        pass
        def f(self):
            print("C")
    class A(B,C):
        pass
        def f(self):
            print('A')
    a=A()
    a.f()
    print(A.mro())
    # [<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>, <class '__main__.D'>, <class 'object'>]
    新式类钻石继承例子

    4、

    5、

     

    6、总结  

    三、抽象类和接口类

       继承——抽象类和接口类——是一种设计模式

    其他语言的多态方法:

     python 自带多态

    今日内容总结:

  • 相关阅读:
    SQL Server中的执行引擎入门
    SQL Server复制入门(一)复制简介
    Django 代码片断收集(持续更新)
    今天思路有点乱,随便记一点关于 xmlrpc 的
    PIL 学习笔记(1)
    Django newforms
    在 Django 的 View 中利用 function decorator 可实现一定程度的代码重用
    今天在 Linux 上顺利编译 PIL 1.1.6 成功
    用 PIL 写了个简单的缩略图生成程序
    [转贴] 中药内外合治急慢性鼻窦炎
  • 原文地址:https://www.cnblogs.com/number1994/p/8073081.html
Copyright © 2011-2022 走看看