python面向对象三大特性之继承、多态

继承

什么是继承          

  所谓继承指提供了同一类对象共性的处理方法,子类继承父类共性的东西。 这样有利于代码的复用性,即子类拥有父类的方法。通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。

  继承可以想象成什么是什么的关系

python中类的继承分为:单继承和多继承

class Parent1: # 父类1
    pass
class Parent2: #父类2
    pass
class Son1(Parent1):  #单继承,基类是ParentClass1,派生类是Son1
    pass
class Son2(Parent1,Parent2):  #多继承,父类是Parent1和Parent2,派生类是Son2
    pass

查看继承

>>> Son1.__bases__ #__base__只查看从左到右继承的第一个父类,__bases__则是查看所有继承的父类
(<class ‘__main__.Parent1‘>,)
>>> Son2.__bases__
(<class ‘__main__.Parent1‘>, <class ‘__main__.Parent2‘>)如果没有指定基类,python的类会默认继承object类,object是所有python类的基类>>> Parent1.__bases__ (<class ‘object‘>,)


# class Animal:   #     def __init__(self,name,eat,drink,push,shit):#         self.name=name#         self.eat= eat#         self.drink= drink#         self.push= push#         self.shit= shit# class Dog(Animal):      #     def cry(self):   #         print(‘%s汪汪汪‘%self.name)   #在子类中可以使用父类继承的name# class Cat(Animal):#     def cry(self):   #         print(‘%s喵喵喵‘%self.name)# # teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)# cat1=Cat(‘加菲‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)# print(cat1.name)            #调用属性无需添加()# teddy.cry()             #调用方法需要添加(),因为方法本质是函数
加菲

泰迪汪汪汪

在python3中,子类执行父类的方法也可以直接用super方法.

# class Animal:
#     def __init__(self,name,eat,drink,push,shit):
#         self.name=name
#         self.eat= eat
#         self.drink= drink
#         self.push= push
#         self.shit= shit
#     def run(self):
#         print(‘%s running‘%self.name)
# class Dog(Animal):
#     def cry(self):
#         super(Dog,self).run()           #super(Dog,self).run() =Animal().run(self)=super().run()     执行父类的方法
#         print(‘%s汪汪汪‘%self.name)
# class Cat(Animal):
#     def cry(self):         super().__init()              #执行父类的属性    
#         print(‘%s喵喵喵‘%self.name)
#
# teddy=Dog(‘泰迪‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# cat1=Cat(‘附近反‘,‘吃‘,‘喝‘,‘拉‘,‘撒‘)
# print(teddy.name)
# teddy.cry()

多继承顺序

python3以上(新式类): 广度优先

python2(经典类)   :深度优先

class A(object):
    def test(self):
        print(‘from A‘)

class B(A):
    def test(self):
        print(‘from B‘)

class C(A):
    def test(self):
        print(‘from C‘)

class D(B):
    def test(self):
        print(‘from D‘)

class E(C):
    def test(self):
        print(‘from E‘)

class F(D,E):
    # def test(self):
    #     print(‘from F‘)
    pass
f1=F()
f1.test()
print(F.__mro__) #只有新式才有这个属性可以查看线性列表,经典类没有这个属性<class ‘__main__.F‘>, <class ‘__main__.D‘>, <class ‘__main__.B‘>, <class ‘__main__.E‘>, <class ‘__main__.C‘>, <class ‘__main__.A‘>, <class ‘object‘>

#新式类继承顺序:F->D->B->E->C->A
#经典类继承顺序:F->D->B->A->E->C
#python3中统一都是新式类
#pyhon2中才分新式类与经典类

多态

什么是多态:相同方法调用,执行不同动作

  向不同的对象发送同一条消息(!!!obj.func():是调用了obj的方法func,又称为向obj发送了一条消息func),不同的对象在接收时会产生不同的行为(即方法)。 也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class People(Animal): #动物的形态之一:人
    def talk(self):
        print(‘say hello‘)

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print(‘say wangwang‘)

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print(‘say aoao‘)def func(object)  object.talk()    #我们可以定义一个统一的接口来使用   三个类都有talk的方法

原文地址:https://www.cnblogs.com/caoyf1992/p/8522917.html

时间: 2024-08-05 12:25:03

python面向对象三大特性之继承、多态的相关文章

(1) 深入理解Java面向对象三大特性 封装 继承 多态

转眼已经工作快6年了,最开始做了2年J2EE:然后整了2年的数据仓库,主要是Cognos的报表开发:现在从事4G LTE核心网的开发,用的语言任然是Java,但写代码的机会不多,基本都是看代码找BUG,偶尔做点new feature也是在比较成熟的框架上复制.粘贴.修改,大部分时间还是在理解业务,钱多.事少.离家近,当时来这家公司图的是后面2点,2年过去了,英文水平有所提升,对敏捷开放也有一定的了解,但技术方面明显退步了或者说没有进步吧,本来以前也不怎么好,因为工作上用不到,自己也没怎么学习,所

面向对象三大特性(封装/继承/多态)

引入:在面向对象思想中,有三大特性,封装  继承  多态. 思考:我们在使用类和对象实现编程的时候,到底是遵循这什么样的逻辑呢?为什么要这样规范类呢? 引入:面向对象很重要的思想就是隐藏,即外部不知道类内部是如何实现业务逻辑的,只管调用和使用结果,这个就是面向对象三大特性之一:  封装 1.封装[掌握] 定义:封装,字面意思就是将内容装到某个容器中,并进行密封保存,在面向对象思想中,封装指数据和对数据的操作捆绑到一起,形成 对外界的隐藏,同时对外提供可以操作的接口. 1.数据:即要操作的数据,在

【Python学习之旅】---多态(类的相关知识,面向对象三大特性:继承-多态-封装)

class Name: __a='你是猪' #封装变量a def __init__(self,name): self.name=name def get_name(self): print('我叫%s' %self.name) n1=Name('陈宇霞')print(Name.__dict__) #查看类属性字典print(n1._Name__a) #可以通过此种方式调用__a ,没有真正的封装 #执行结果: {'__module__': '__main__', '_Name__a': '你是猪

【Python学习之旅】---封装与反射(类的相关知识,面向对象三大特性:继承-多态-封装)

#第一层封装:定义类#第二层封装:区分内外,有些属性只能内部使用,外部不能 class Name: __a='你是猪' #封装变量a def __init__(self,name): self.name=name def get_name(self): print('我叫%s' %self.name) n1=Name('陈宇霞')print(Name.__dict__) #查看类属性字典print(n1._Name__a) #可以通过此种方式调用__a ,没有真正的封装 #真正的封装:区分内外,

面向对象三大特性:封装,继承,多态(一,封装和继承)

封装.继承和多态是面向对象程序设计的三个核心特性. 封装是面向对象技术中的一个重要概念,是一种信息隐藏技术,它体现了面向对象程序设计的思想. 继承是面向对象程序设计方法的一个重要手段,通过继承可以更有效地组织程序结构,明确类间的关系,育雏利用已有的类来完成更复杂.更深入的程序开发. 多态允许以一种统一的风格处理已存在的变量和相关的类,多态性使得向系统增加功能变的容易. 一.封装 封装的含义是:类的设计者把类设计成一个黑匣子,使用者只能看见类中定义的公共变量和公共方法,而看不见方法的具体实现细节,

Java面向对象三大特性 封装 继承 多态

1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类把自己该做的事情封装起来,而不是暴露给其他类去处理,当内部的逻辑发生变化时,外部调用不用因此而修改,他们只调用开放的接口,而不用去关心内部的实现 举例: public class Human { private int age; private String name; public int get

面向对象三大特性:封装,继承,多态(二、多态)

多态 一,多态的概念 多态(polymorphism), 是指一个名字可以有多种语义.在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法.通常有两种途径实现多态:方法的重载和覆盖. 多态性允许以统一的风格处理已存在的变量及相关的类.多态性使得向系统里增加新功能变得容易.继承性和多态性是降低软件复杂性有有效技术. 二,多态的实现 1.方法的重载 方法重载时: 参数必须不同.参数个数不同或类型不同. 返回值可以相同,也可以不同. 重载的价值在于它允许通过使用一个

面向对象三大特性:封装,继承,多态(三、多态的进一步讲解)

多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型.,根据其实际的类型调用其相应的方法. 多态也叫动态绑定,也叫迟绑定. 多态的存在有三个必要条件: 要有继承 要有重写 父类引用指向子类对象

面向对象的三大特性---封装继承多态

面向对象的三大特性---封装继承多态 首先我们来创建一个控制台程序 新建一个父类Person 创建一个子类继承父类Person 子类: main函数: 输出结果: 根据结果显示创建子对象,首先调用父类的构造函数在调用子类的构造函数. 继承的传递性 例如: A:B,B:C,则A:C ⅰ.继承过来之后被隐藏,有意隐藏加一个关键字"new",如果加了关键字"new",就告诉子类,父类里面的sayHi只能被隐藏,不能被覆写  ⅱ.继承过来之后被覆写/重写,覆写需要在父类里面