一、上节回顾:
命名空间:
静态属性:属于类内部的命名空间
动态属性:属于类内部的命名空间
对象属性:属于对象的,在类内和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 自带多态
今日内容总结: