一、上节回顾:

   命名空间:  

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

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

      对象属性:属于对象的,在类内和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 自带多态

今日内容总结: