python之面向对象进阶
接口类
抽象类
钻石继承
多态
鸭子类型
接口类
接口类
继承有两种用途:
一:继承基类的方法,并且做出自己的改变或者扩展(代码重用)
二:声明某个子类兼容于某基类,定义一个接口类Interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子类继承接口类,并且实现接口中的功能
代码如下
class Applepay:
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay:
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay:
def fuqian(self,money):
print('微信支付了%s'%money) def payment(pay_obj,money):
pay_obj.pay(money) apple1 = Applepay()#实例化一个对象
apple1.pay(20)#调用里面的函数
payment(apple1,50)#通过payment函数调用也可以
但是我们实例化一个Wechatpay不会报错但是如果调用pyament函数就会出错
class Applepay:
def pay(self,money):
print('apple pay 支付了%s'%money) class Alipay:
def pay(self,money):
print('支付宝 支付了%s'%money) class Wechatpay:
def fuqian(self,money):
print('微信支付了%s'%money) def payment(pay_obj,money):
pay_obj.pay(money) # apple1 = Applepay()#实例化一个对象
# apple1.pay(20)#调用里面的函数
# payment(apple1,50)#通过payment函数调用也可以 wechat1 = Wechatpay()
payment(wechat1,200)
这不是我们想要的结果,我们希望在函数运行时就会发现发现(实例化时就会发现错误)
通过调用接口类,下面所有的类都要根据接口类的格式来
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)
wechat1 = Wechatpay()#实例化时就会报错
接口类的作用:约束继承接口类的子类必须实现被abstractmethod来装饰,在接口类中不要做实现,接口类不能被实例化。
实践中,继承的第一种含义意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。
继承的第二种含义非常重要。它又叫“接口继承”。
接口继承实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做归一化。
归一化使得高层的外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,对底层设计者,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。
接口类符合:依赖倒置原则
依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
抽象类(在类中的方法可以实现一定的实现)(从小范围到大范围)
from abc import ABCMeta,abstractmethod
class Animal(metaclass=ABCMeta):
@abstractmethod
def eat(self):
print('打开粮食的袋子')#抽象类可以实例化一些方法
print('放一个吃饭的碗')
print('把粮食倒在碗里') @abstractmethod
def sleep(self):
pass class Dog(Animal):
def eat(self):
super().eat()#重写父类方法
print('dog is eating')#给子类一个新的方法 def sleep(self):
print('dog is sleeping')
d=Dog()
d.eat()
我们发现抽象类与接口类的区别就是在类内是否可以实现。
#抽象类
#在Python里 默认是有的
#父类的方法 子类必须实现
#抽象类 不能被实例化
#抽象类内的方法 可以被简单实现
#接口类(在抽象类的基础上)
#在python里 默认是没有的
#接口类中的方法 不能被实现
#原则:抽象类最好不要用多继承,而接口类可以
抽象类与接口类的区别:
当几个子类的父亲有相同的功能需要被实现的时候就用抽象类。
当几个子类有相同的功能,但是实现是各个不相同的时候就用接口类。
钻石继承
python里分为新式类和经典类。新式类是广度优先;经典类是深度优先。在新式类内可以通过.mro来看到继承的顺序。
总结:
继承的作用:
减少代码的重用
提高代码可读性
规范编程模式
几个名词:
抽象:抽象即抽取类似或者说比较像的部分。是一个从具题到抽象的过程。
继承:子类继承了父类的方法和属性
派生:子类在父类方法和属性的基础上产生了新的方法和属性
抽象类与接口类
1.多继承问题
在继承抽象类的过程中,我们应该尽量避免多继承;
而在继承接口的时候,我们反而鼓励你来多继承接口 2.方法的实现
在抽象类中,我们可以对一些抽象方法做出基础实现;
而在接口类中,任何方法都只是一种规范,具体的功能需要子类实现
钻石继承:
新式类:广度优先
经典类:深度优先
多态:
多态指的是一类事物有多种形态
class Animal:pass
class Cat(Animal):
def eat(self):
print('cat eat')
class Dog(Animal):
def eat(self):
print('dog eat')
def eat_func(a):
a.eat() c = Cat()
eat_func(c)
d = Dog()
eat_func(d) #python自带多态:#1 同一类事物的不同状态
#2 操作的时候不需要关心这个对象的数据类型,只要去用就可以了
鸭子类型
Python崇尚鸭子类型,即‘如果看起来像、叫声像而且走起路来像鸭子,那么它就是鸭子’
python程序员通常根据这种行为来编写程序。例如,如果想编写现有对象的自定义版本,可以继承该对象
也可以创建一个外观和行为像,但与它无任何关系的全新对象,后者通常用于保存程序组件的松耦合度。
python之面向对象进阶的更多相关文章
- python基础——面向对象进阶下
python基础--面向对象进阶下 1 __setitem__,__getitem,__delitem__ 把对象操作属性模拟成字典的格式 想对比__getattr__(), __setattr__( ...
- python基础——面向对象进阶
python基础--面向对象进阶 1.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 ...
- Python 3 面向对象进阶
Python 3 面向对象进阶 一. isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的 ...
- day021|python之面向对象进阶1
面向对象进阶 目录 面向对象进阶 1 继承 1.1 继承入门 1.1.1 继承基础 1.1.2 类的基本使用 1.2 多继承 1.2.1 多继承的基本使用 1.2.2 多继承以后的重复性 1.3 类的 ...
- python基础-面向对象进阶
一.什么是反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被 ...
- python学习------面向对象进阶
一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...
- python之面向对象进阶2
封装.property装饰器 封装分为3种情况:封装对象的属性.封装类的属性.封装方法. 封装对象的属性:(在属性名前加双下划线__) class Person: def __init__(self, ...
- python开发面向对象进阶:反射&内置函数
isinstance和issubclass isinstance(obj,cls)检查是否obj是否是类 cls 的对象或者子类的对象 class Foo(object): pass class ba ...
- Python之面向对象进阶------反射(Day26)
一 classmethod class Classmethod_Demo(): role = 'dog' @classmethod def func(cls): print(cls.role) Cla ...
- python之面向对象进阶3
1.isinstace和issubclass 2.staticmethod和classmethod 3.反射(hasattr.getattr.setattr.delattr等四个方法) 4.内置方法 ...
随机推荐
- Tomcat8源码笔记(三)Catalina加载过程
之前介绍过 Catalina加载过程是Bootstrap的load调用的 Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...
- Jmeter JDBC Request 查询语句中有汉字查询结果为空的解决方法
搜索接口我会校验返回值,查询JDBC Request 查询语句有中文字的时候查询会有问题. 解决方法很简单,在JDBC Connection Configuration的Database URL里加一 ...
- MyBatis从入门到放弃二:传参
前言 我们在mapper.xml写sql,如果都是一个参数,则直接配置parameterType,那实际业务开发过程中多个参数如何处理呢? 从MyBatis API中发现selectOne和selec ...
- 你不知道的Linux(持续更新中)
1.关于GNU.Linux.GNU/Linux三者的关系 GNU 项目创始于一九八四年,旨在开发一个类似 Unix ,且为自由软件的完整的操作系统: GNU 系统.(也可把GNU看成一个自由软件工程) ...
- html页面背景设定相关
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- plt 数据可视化
1.plt.plot(x,y,color) 折线坐标图 import matplotlib.pyplot as plt h = np.linspace(1, 10, 10) v = np.linspa ...
- Units in Android
一般使用dp,不使用px.sp啥时候用呢?给TextView设置文字大小的时候用.
- Ubuntu18.04 安装mysql8.0.11
1.下载deb包 2.运行命令 sudo dpkg -i mysql-apt-config_0.8.10-1_all.deb sudo apt update 3.安装mysql8 sudo apt i ...
- SpringCloud+Feign环境下文件上传与form-data同时存在的解决办法(2)
书接上文. 上文中描述了如何在 SpringCloud+Feign环境下上传文件与form-data同时存在的解决办法,实践证明基本可行,但却会引入其他问题. 主要导致的后果是: 1. 无法与普通Fe ...
- [Linux.NET]Nginx 泛解析配置请求映射到多端口实现二级域名访问
由于想实现一个域名放置多个应用运行的目的,而不想通过域名后加端口号方式处理,这种方式处理记起来太麻烦,偷懒党简直不能忍,故而考虑了使用二级域名来处理多个应用同时运行.Google了一番资料并进行了尝试 ...