继承

继承的表现方式:

class Animal():
pass
class Cat(Animal): #animal是cat的父类,也可以说是基类
pass
print(Cat.__bases__)#查看Cat的所有父类

单继承

一个类只有一个父类

狗和鸟都是动物,都拥有吃喝这两种技能,但游泳是狗的特殊技能,飞逝鸟的特殊技能,只能在本类中进行扩展

子类中独有方法如何实现

实现了子类中独有方法,那子类有独有的属性呢?我养了一个小泰迪,我给他起个名字,但是鸟就没有这个属性

class Animal():
def __init__(self,kind):
self.kind = kind
def eat(self):
print('eat...')
def drink(self):
print('drink...') class Dog(Animal):
def __init__(self,kind,name):
# Animal.__init__(self,kind) #为继承的父类中的属性初始化赋值
super().__init__(kind) #用super找到父类 跟上句话的效果相同
self.name = name #为本类独有的属性进行初始化赋值,派生属性
def swimming(self):
print('dog swimming') class Bird(Animal):
def fly(self):
print('bird flying')
def eat(self):
print('bird eat') b1 = Bird('麻雀')
b2 = Dog('tiddy','judy')
print(b1.kind)
print(b2.name)

子类中独有属性如何实现

多继承

一个类有多个父类

class A():
def fun(self):
print('aaa')
class B():
def fun(self):
print('bbb')
class C():
def fun(self):
print('ccc')
class D(A,B,C): #继承A,B,C
pass
d = D()
d.fun() #aaa--->调用A类中的fun方法,按照继承顺序A

简单多继承

钻石继承
'''
A
B C D E
F
F继承DE,D继承B,E继承C,BC继承A
顺序是:F->D->B->E->C->A
'''
# 另一个问题,关于super,super真的是找父类吗?
# class A():
# def fun(self):
# print('a')
# class B(A):
# def fun(self):
# super().fun() #-->找C
# print('b')
# class C(A):
# def fun(self):
# super().fun() #-->找A
# print('c')
# class D(B,C): #继承B,C
# def fun(self):
# super().fun() #-->找B
# print('d')
# d = D()
# d.fun() #打印结果是 a c b d
# #以菱形多继承为例,发现是根据优先算法找到的上一级

super问题

接口类和抽象类

python中其实是没有接口的概念的,接口类和抽象类是java中的概念,目的是制定一个规范

接口类和抽象类都不能被实例化

# 接口类
# 支持多继承,接口类中的所有方法都不能实现
# 抽象类
# 不支持多继承,抽象类中的方法可以被实现

接口类

from abc import abstractmethod,ABCMeta
#创建一个规范类
class Payment(metaclass=ABCMeta):#指定元类
@abstractmethod
def pay(self):pass #继承该类的类必须实现本方法

接口类的多继承

思考:

如何在代码尽不重复的情况下,定义三个类:1.鸟-->会飞,会走 2.狗-->会游泳,会走 3.鸭子-->会游泳,会飞,会走

from abc import abstractmethod,ABCMeta
class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):
pass
class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):
pass
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):
pass
class Bird(Fly_Animal,Walk_Animal):pass
class Dog(Walk_Animal,Swim_Animal):pass
class Duck(Walk_Animal,Swim_Animal,Fly_Animal):pass
b = Bird() # 报错 TypeError: Can't instantiate abstract class Bird with abstract methods fly, walk
# 继承规范接口类的类必须实现加@abstractmethod 装饰器的方法,否则报错

接口类的多继承

抽象类

规定只使用单继承

实现一个抽象类

import abc
#创建一个规范类
class Payment(metaclass=abc.ABCMeta):#指定元类
@abc.abstractmethod
def pay(self):pass #继承该类的类必须实现本方法

多态

python天生支持多态

鸭子类型

python中的继承和多态的更多相关文章

  1. Python 中的继承、多态和封装

    涉及问题: Python 中如何实现多继承,会有什么问题? Python 中的多态与静态方法有什么区别? 答案要点如下: Python 中的继承,就是在定义类时,在括号中声明父类,简单示例如下: cl ...

  2. Python面向对象中的继承、多态和封装

    Python面向对象中的继承.多态和封装 一.面向对象的三大特性 封装:把很多数据封装到⼀个对象中,把固定功能的代码封装到⼀个代码块, 函数,对象, 打包成模块. 这都属于封装思想. 继承:⼦类可以⾃ ...

  3. Python 面向对象编程 继承 和多态

    Python 面向对象编程 继承 和多态 一:多继承性 对于java我们熟悉的是一个类只能继承一个父类:但是对于C++ 一个子类可以有多个父亲,同样对于 Python一个类也可以有多个父亲 格式: c ...

  4. C中的继承和多态

    昨天同学面试被问到这个问题,很有水平,以前都没有遇到过这个问题,一时自己也不知道怎么回答. 网上学习了一下,记录以备后用! C/C++ Internals : 里面的问题都写的不错,可以读读! Ref ...

  5. java中的继承 和多态。

    package com.aaa.zxf.ajax.test; /** *一. java 中的继承和多态. * * 继承的特性? * 1.实现继承的方式 * A 如何建立继承关系(一个类继承于 另一个类 ...

  6. python大法好——继承、多态

    1.继承 类的继承 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制. 通过继承创建的新类称为子类或派生类,被继承的类称为基类.父类或超类. 继承语法 class 派 ...

  7. Python面向对象:继承和多态

    继承与多态简介: 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写. 动态语言的鸭子类型特点决定了继承不像静态语言那样是必须的. ...

  8. python类的继承和多态

    现在属于是老年人的脑子,东西写着写着就忘了,东西记着记着就不知道了.之前学C++的时候就把类.对象这块弄得乱七八糟,现在是因为很想玩python,所以就看看python的类和对象. 就像说的,类有三个 ...

  9. Objective-C中的继承和多态

    面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点.OC中和Java类似,不支持多重继承,但OOP语言C++就支持多 ...

随机推荐

  1. 逆向工程vgenerator(二)

    前言 接上篇,这一篇主要的工具类和工厂类,包括数据库方法.通用方法,三个工厂. 常量 /** *author vvxtoys *默认xml开头 *文档分隔 *默认方法名 */ package cc.v ...

  2. leetcode每日刷题计划-简单篇day5

    刷题成习惯以后感觉挺好的 Num 27 移除元素 Remove Element 跟那个排序去掉相同的一样,len标记然后新的不重复的直接放到len class Solution { public: i ...

  3. POJ_1321

    题目   在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆 ...

  4. mysql-day1

    -- 数据库的操作 -- 链接数据库 mysql -uroot -p mysql -uroot -pmysql -- 退出数据库 exit/quit/ctrl+d -- sql语句最后需要有分号;结尾 ...

  5. dojo下的dom按钮与dijit/form/Button

    众所周知,在dojo里存在dom和widget两个类型,dom指的是普通类型的HTML元素,包括各种类型的标签.按钮.输入框等等,而widget指的是dojo自身所带的模板,同时也包括按钮.输入框等等 ...

  6. 二叉搜索树的第K大节点

    题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点. 分析 对二叉搜索树进行逆向中序遍历(先右再左),则遍历序列是降序排序的,因此中序遍历一颗二叉搜索树,可以很容易的得到它的第k大的节点.使用一个 ...

  7. 2017.2.6Redis连接问题排查

    现象:早8:15起开始收到redis主从不停切换的报警短信,某系统连接流控redis报超时. 排查:1.查看zabbix,看流控系统的redis服务器是否正常——正常: 2.查看redis监控,red ...

  8. CAS 无锁队列

    队列是常用的数据结构,采用的FIFO(first in firstout)原则,新元素(等待进入队列的元素)总是被插入到尾部,而读取的时候总是从头部开始读取.在计算中队列一般用来做排队(如线程池的等待 ...

  9. ucos中消息队列的应用(二)

    继续说任务间的通信. 本次的任务是在ISR中发送一个消息给任务,ucos的代码中的是非常之简洁和容易理解啊.创建,释放,等待,非常好理解,不再赘述. 说说我遇到的问题,数据帧接收完之后,向消息队列发送 ...

  10. android 组件隐藏

    参考 https://blog.csdn.net/bbtianshi/article/details/79556609 view.setVisibility(View.GONE);