博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python-继承以及继承问题和多态
阅读量:6223 次
发布时间:2019-06-21

本文共 4074 字,大约阅读时间需要 13 分钟。

继承 # 面向对象的三大特性之一:继承 # 继承:至少有两个类:什么是什么的关系,为了避免几个类之间有相同的代码 # 父类:Animal # 子类:Dog Person # 动物
class Animal:    def __init__(self,name,aggressivity,life_value):        self.name = name        self.aggressivity = aggressivity        self.life_value = life_value#狗class Dog(Animal):  # 定义一个狗类    def bite(self,people):        people.life_value -= self.aggressivity#人class Person(Animal):  # 定义一个人类    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  # 金老板的攻击力增加了huang = Dog('大黄', 100, 3000)  # __init__ 找父类print(huang.life_value)boss_gold = Person('金老板', 5, 250)  # __init__ 自己没有 找父类print(boss_gold.life_value)# Dog.bite(Person)print(Dog.__bases__)print(Animal.__bases__)
示例
# python中有两种类:经典类和新式类
# python3中是只有新式类---都默认继承object,class Animal(object) == class Animal: # python2经典类和新式类并存 #             class Animal:  -->是经典类 #              class Animal(object):--->新式类 # class ParentClass1: #定义父类 #     pass # # class ParentClass2: #定义父类 #     pass # # class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass #     pass # # class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 #     pass # SubClass1.__bases__ #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类 小结: # 两个类中有相同的代码 # 继承:把相同的代码放在父类中,子类的对象在子类中没有找到方法的时候,会使用父类的 # 单继承和多继承 # 父类也称为超类或基类 # 子类又称为派生类 # 抽象和继承的关系:先抽象再继承
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+=10class 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#人class Person(Animal):    def __init__(self, name, aggressivity, life_value, money):        # Animal.__init__(self,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  # 金老板的攻击力增加了snoopy= Dog('太白','京巴',250,500)print(snoopy.name)print(snoopy.breed)snoopy.eat()print(snoopy.life_value)super(Dog,snoopy).eat()         #Animal.eat(snoopy)print(snoopy.life_value)
派生属性:在自己的init方法里 使用父类的init方法 ---指名道姓调用方法 # 派生方法:在子类中增加父类没有的 # 只要子类有,就用子类的属性或方法 # 只要想用父类的,就用Animal.eat(snoopy)  父类名.父类的方法(子类对象)     ---这是2.7经典类中的调用方法 # 在新式类中需要使用super方法  super(子类名,子类对象).方法名() 类内可以省略super的参数    --这是新式类中的 # 用子类的对象,调用父类的方法: # 如果子类中没有这个方法,直接使用父类的 # 如果子类中有与父类同名的方法:         # 经典类:指名道姓调用  类名.方法名(子类对象) 类内外一致         # 新式类:使用super方法,super(子类名,子类对象).方法名() 类内可以省略super的参数
面试题:

钻石继承问题

# 本小节的环境是在python2.7中# 经典类和新式类的多继承问题,继承顺序问题# 经典类:博大精深,所以经典类就是深度优先,先往深处找# 新式类:广度优先class F(object):    pass    def f(self):        print('F')class E(F):    pass    def f(self):        print('E')class D(F):    pass    # def f(self):    #     print('D')class B(D):    pass    # def f(self):    #     print('B')class C(E):    pass    def f(self):        print('C')class A(B,C):    pass    # def f(self):    #     print('A')a = A()a.f()print(A.mro()) #新式类:查看继承顺序# class A(object):pass #新式类# py3 —— 广度优先# py2 —— 新式类#面试 —— 能对应 新式类 是广度优先 经典类是深度优先

 

 多态

#python不支持多态的class Animal:passclass Person(Animal):    def attack(self):        passclass Dog(Animal):    def attack(self):        passdef attack(obj):  #多态    obj.attack()d = Dog()p = Person()attack(d) #d.attack()attack(p) #p.attack()print(10)#鸭子类型 list tuple是一对鸭子类型#列表#元组# 切片 : 字符串 列表 元组# + :字符串 列表 数字def len(l):pass

 

 

 

 

 

转载于:https://www.cnblogs.com/dwenwen/p/7874970.html

你可能感兴趣的文章
django orm中利用annotate进行group by
查看>>
CSS3———— animate(),transtion,transfrom.translate()
查看>>
[转载]JAVA中int、String的类型转换
查看>>
C语言的一些常用代码
查看>>
Java对象创建方式及JVM对字符串处理
查看>>
ubuntu 安装php7
查看>>
Service服务详解以及如何使service服务不被杀死
查看>>
Swift:在Safari中打开App
查看>>
windbg断点
查看>>
深入理解PHP原理之变量(Variables inside PHP)
查看>>
JDK版本8u191与8u192的区别
查看>>
qt常见错误
查看>>
移植Qt4.8.4项目到QT5.2上时遇到的一些问题
查看>>
Dot Graphviz Manual
查看>>
$.Ajax发送请求的注意事项
查看>>
Redis学习笔记7--Redis管道(pipeline)
查看>>
eclipse下jetty启动后不能编辑css的问题
查看>>
mysql中sql语句使日期增加一年
查看>>
视频分享网站首页:最热视频特效
查看>>
EditPlus行首行尾批量添加字符
查看>>