面向对象的进阶-------继承

初始面向对象之后,我们来学习面向对象的三大特性以及面向对象的其他补充方面的知识。

  继承

        定义:继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又叫做基类或超类,新建的类被称为派生类或子类。

     python中类的继承可以分为单继承和多继承

 查看继承的方法是_base_     #__base__只查看从左到右继承的第一个子类,__bases__则是查看所有继承的父类

注:如果没有指定基类,python中的类会默认继承object类,object类是所有类的基类,并且提供了一些常见方法,如(_str_)的实现

优点:解决代码重用的问题,减少代码冗余

继承解决的问题:什么是什么(类与类之间的关系)

组合:是一种什么有什么的关系,也是为了减少重复代码。

实例一
class Animal:
    def eat(self):
        print(‘eating‘)
    def drink(self):
        print(‘drink‘)
class Cat(Animal):  #继承了Animal类
    def __init__(self,name):
        self.name=name
        self.breed=‘猫‘
    def cry(self):
        print(‘喵喵叫‘)
class Dog(Animal):
    def __init__(self,name):
        self.name=name
        self.breed=‘狗‘
    def wang(self):
        print(‘汪汪叫‘)
a1=Cat(‘加菲猫‘)
print(a1.name)
a1.eat()
b1=Dog(‘汪汪狗‘)
print(b1.name)
b1.drink()
class Person:
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    def walk(self):
        print(‘%s is walk‘%self.name)

实例二
class Teacher(Person):
    def __init__(self,name,age,sex,salary):
        Person.__init__(self,name,age,sex)
        self.salary=salary
    def teacher(self):
        print(‘%s is teacher‘%self.name)
    def foo(self):
        Person.foo(self)
        print(‘from teacher‘)

class Student(Person):
     def __init__(self,name,age,sex,group):
         Person.__init__(self,name,age,sex)
         self.group=group
     def study(self): #定义了Student类的study方法
         print(‘%s is study‘%self.name)
t=Teacher(‘egon‘,35,‘male‘,1000)
print(t.name)
t.walk()
t1=Student(‘小明‘,18,‘male‘,‘老男孩‘)
t1.study()

继承的实例

   一、 继承与抽象

        抽象即抽取类似或者说比较像的部分。

        继承:是基于抽象的结果,通过编程语言去实现它,肯定肯定是先经历抽象这个过程,才能通过继承的方式去表达出抽象的结构。

   二、   派生

 派生指的是子类可以添加自己的新属性或者重新定义这些属性(不会影响到父类),但需要注意的是一旦定义的自己的属性名与父类的属性名相同时,那么在调用新增的属性时,就用自己的。   

class Animal:
    def __init__(self,name,aggr,life_value):
        self.name=name
        self.aggr=aggr
        self.life_value=life_value
    def eat(self):
        print(‘%s is eating‘%self.name)
class Dog(Animal):
    def bite(self,people):
        ‘‘‘
        派生:狗有咬人的功能
        ‘‘‘
        people.life_value-=self.aggr
class Person(Animal):
    ‘‘‘人类继承了Animal‘‘‘
    def attack(self,dog):
        ‘‘‘
        派生:人有攻击的技能
        ‘‘‘
        dog.life_value-=self.aggr
egg=Person(‘egon‘,100,5000)
ha2=Dog(‘二愣子‘,20,1000)
print(ha2.life_value)
egg.attack(ha2)
print(ha2.life_value)

三、  抽象类和接口类

抽象类的本质还是类,指的是一组类的相似性,包括数据属性(如all_type)和函数属性(如read、write),而接口只强调函数属性的相似性。

抽象类是一个介于类和接口直接的一个概念,同时具备类和接口的部分特性,可以用来实现归一化设计

在python中,并没有接口类这种东西,即便不通过专门的模块定义接口,我们也应该有一些基本的概念。

1、多继承问题

在继承抽象类的过程中,我们应该尽量避免多继承;

而在继承接口的时候,我们反而鼓励你来多继承接口

2、抽象类方法的实现

(1)在抽象类中,我们可以对一些抽象方法做出基础实现;

from abc import ABCMeta,abstractclassmethod
class Animal(metaclass=ABCMeta):
    @abstractclassmethod
    def eat(self):
        print(‘打开袋子‘)
        print(‘放个碗‘)
        print(‘把粮食倒在碗里‘)
    def sleep(self):
        pass
class Dog(Animal):
    super().eat()
    def eat(self):
        print(‘dog is eating‘)
    def sleep(self):
        print(‘dog is sleeping‘)

d=Dog()
d.eat()

抽象类

抽象: 从小范围到大范围

(2)而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现

from abc import ABCMeta,abstractmethod
class Payment(metaclass = ABCMeta):  #metaclass --> 元类
    @abstractmethod
    def pay(self,money):pass

class Applepay(Payment):
    def pay(self,money):
        print(‘apple pay 支付了%s‘%money)

class Alipay(Payment):
    def pay(self,money):
        print(‘支付宝 支付了%s‘%money)

class Wechatpay(Payment):
    def fuqian(self,money):
        print(‘微信支付了%s‘%money)

def payment(pay_obj,money):
    pay_obj.pay(money)

apple1 = Applepay()
ali1 = Alipay()
wechat1 = Wechatpay()
payment(wechat1,200)

接口类

注:#接口类   #约束继承接口类的子类必须实现被abstractclassmethod装饰的方法   #在接口类中不要不要做实现   #接口类不能被实例化

(3)总结

当几个子类的父类,有相同的功能,就用抽象类当几个子类 有相同的功能 但实现各不相同的时候就用接口类抽象类和接口类的本质作用:约束

钻石继承

继承顺序

python如果继承了多个类寻找方法有两个方法深度优先(经典类)和广度优先(新式类),而python3中没有经典类了,所以我们不用考虑多重情况。

新式类:广度优先
经典类:深度优先
 
时间: 2024-10-12 22:22:56

面向对象的进阶-------继承的相关文章

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类

[.net 面向对象程序设计进阶] (13) 序列化(Serialization)(五) JSON序列化利器 Newtonsoft.Json 及 通用Json类 本节导读: 关于JSON序列化,不能不了解Json.net(Newtonsoft.Json)这款世界级的开源类库,除了拥有良好的性能之外,功能也是非常强大的. 本节会详细说明这个类库.此外,对于不喜欢使用第三方类库的同学,会整理一个基于微软类库的通用Json类. 读前必备: 本节主要介绍一款第三方类库和一个自己整理封装的类库,说起到封装

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用

[.net 面向对象程序设计进阶] (7) Lamda表达式(三) 表达式树高级应用 本节导读:讨论了表达式树的定义和解析之后,我们知道了表达式树就是并非可执行代码,而是将表达式对象化后的数据结构.是时候来引用他解决问题.而本节主要目的就是使用表达式树解决实际问题. 读前必备: 本节学习前,需要掌握以下知识: A.继承 [.net 面向对象编程基础]  (12) 面向对象三大特性——继承 B.多态 [.net 面向对象编程基础]  (13) 面向对象三大特性——多态 C.抽象类 [.net 面向

python面向对象编程进阶

python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(object): 2 pass 3 4 obj = Foo() 5 6 isinstance(obj, Foo) issubclass(sub, super)检查sub类是否是 super 类的派生类 1 class Foo(object): 2 pass 3 4 class B

[.net 面向对象程序设计进阶] (5) Lamda表达式(二) 表达式树快速入门

[.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习表达式在程序设计中的优点:比如构造动态查询.动态构造表达式树完成未知对象属性访问,比反射的性能高出很多.我们可以说表达式树才是Lambda的精髓,是我们必须要熟练掌握并灵活运用的. 1.关于表达式树(Expression Tree) 表达式树以树形数据结构表示代码,其中每一个节点都是一种表达式,比如

JavaScript面向对象之类的继承

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

Python基础-第七天-面向对象编程进阶和Socket编程简介

本篇内容: 1.面向对象编程进阶-静态方法 2.面向对象编程进阶-类方法 3.面向对象编程进阶-属性方法 4.面向对象编程进阶-特殊成员(内置方法) 5.面向对象编程进阶-反射 6.异常处理.断言 7.Socket编程简介 一.面向对象编程进阶-静态方法 1.静态方法的实现 通过@staticmethod装饰器可以把其装饰的方法变为一个静态方法: 变成静态方法后,形参中可以不用写self了.如果写了self,默认是不会把对象本身传递给self,需要手动传递: class Dog(object):

[.net 面向对象程序设计进阶] (14) 缓存(Cache) (一) 认识缓存技术

[.net 面向对象程序设计进阶] (14) 缓存(Cache)(一) 认识缓存技术 本节导读: 缓存(Cache)是一种用空间换时间的技术,在.NET程序设计中合理利用,可以极大的提高程序的运行效率. 本节将介绍如何利用缓存写出高效率的代码. 1. 什么是缓存(Cache)? 缓存(Cache)是一种用空间换取时间的技术 存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取. 比如CPU二级缓存.内存.windows文件读取缓存. 2. .NE

进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶

Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 要在类中使用静态方法,需在类成员函数前面加上@staticmethod标记符,以表示下面的成员函数是静态函数.使用静态方法的好处是,不需要定义实例即可使用这个方法.另外,多个实例共享此静态方法. 类方法 类方法与普通的成员函数和静态函数有不同之处,在接触的语言中好像也没见过这种语义,看它的定义: 

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit

[.net 面向对象程序设计进阶] (26) 团队开发利器(五)分布式版本控制系统Git——图形化Git客户端工具TortoiseGit 读前必备: 接上篇: 分布式版本控制系统Git——使用GitStack+TortoiseGit 图形界面搭建Git环境 http://www.cnblogs.com/yubinfeng/p/5182271.html 本篇导读: 上篇介绍了一款Windows环境下的Git服务器工具GitStack ,搭建了最简单的Windows下的Git服务器,需要再次提醒的是