一. 抽象类(接口类)

  与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化.

  从设计角度去看, 如果类是从现实对象抽象而来的, 那么抽象类就是基于类抽象而来的。

    从实现角度来看, 抽象类与普通类的不同之处在于: 抽象类中有抽象方法, 该类不能被实例化, 只能被继承, 且子类必须实现抽象方法. 这一点与接口有点类似, 但其实是不同的.

  实现不同的支付方式:

  

  1. class Alipay:
  2. def __init__(self, money):
  3. self.money = money
  4.  
  5. def alipay(self):
  6. print('使用支付宝支付了%s元' % self.money)
  7.  
  8. class Jdpay:
  9. def __init__(self, money):
  10. self.money = money
  11.  
  12. def jdpay(self):
  13. print('使用京东支付了%s元' % self.money)
  14.  
  15. a = Alipay(500)
  16. a.alipay() # 使用支付宝支付了500元
  17. j = Jdpay(200)
  18. j.jdpay() # 使用京东支付了200元

虽然都实现了支付,但是两个支付都是相同的功能,但调用方却不一样,可以把调用方设置一样.

  1. class Alipay:
  2. def __init__(self, money):
  3. self.money = money
  4.  
  5. def pay(self):
  6. print('使用支付宝支付了%s元' % self.money)
  7.  
  8. class Jdpay:
  9. def __init__(self, money):
  10. self.money = money
  11.  
  12. def pay(self):
  13. print('使用京东支付了%s元' % self.money)
  14.  
  15. def pay(obj):
  16. obj.pay()
  17.  
  18. a = Alipay(500)
  19. pay(a) # 调用函数pay,把对象a穿进去,并执行函数语句
  20. j = Jdpay(200)
  21. pay(j) # 调用函数pay,把对象j穿进去,并执行函数语句
  22. # 调用方都是函数pay 归一化设计

  虽然设置了一个pay函数,但是有可能后面接手你程序的人并不会发现,含是按照第一种的方法实现新的支付方式,所以我们要确保在之后添加的类中要有pay函数.

  1. from abc import ABCMeta, abstractmethod # 从abc模块引进ABCMeta,abstractmethod
  2.  
  3. class Allpay:
  4. @abstractmethod # 在需要制定模板的函数上写一句
  5. def pay(self): # 制定规范,子类中必须有pay方法,否则报错
  6. pass
  7.  
  8. class Alipay(Allpay):
  9. def __init__(self, money):
  10. self.money = money
  11.  
  12. def pay(self):
  13. print('使用支付宝支付了%s元' % self.money)
  14.  
  15. class Jdpay(Allpay):
  16. def __init__(self, money):
  17. self.money = money
  18.  
  19. def pay(self):
  20. print('使用京东支付了%s元' % self.money)
  21.  
  22. class Wechatpay(Allpay):
  23. def __init__(self, money):
  24. self.money = money
  25.  
  26. # def wechatpay(self): #函数名不是pay会报错
  27. # pass
  28. def pay(self):
  29. print('使用微信支付了%s元' % self.money)
  30.  
  31. def pay(obj):
  32. obj.pay()
  33.  
  34. a = Alipay(500)
  35. pay(a) # 使用支付宝支付了500元
  36. j = Jdpay(200)
  37. pay(j) # 使用京东支付了200元
  38. w = Wechatpay(700)
  39. pay(w) # 使用微信支付了700元

二. 多态

  python不支持多态, 也不用支持多态,因为python处处是多态, python是一种多态语言, 参数在传入之前是无法确定参数类型的. 崇尚鸭子类型

   鸭子类型 : 看着像鸭子,他就是鸭子, 下面的类有相同功能的方法, 都互称为鸭子.

  1. class Str:
  2. def index(self):
  3. pass
  4.  
  5. class List:
  6. def index(self):
  7. pass
  8.  
  9. class Tuple:
  10. def index(self):
  11. pass

三. 封装

  封装,顾名思义就是将内容封装到某个地方,以后再去调用被封装在某处的内容。所以,在使用面向对象的封装特性时,需要:将内容封装到某处, 然后从某处调用被封装的内容.

  封装分为广义的封装和狭义的封装

  广义的封装: 实例化一个对象,给对象空间封装一些属性.   

  1. class Animal:
  2. def __init__(self,name,sex,age):
  3. self.name = name #广义的封装
  4. self.age = age
  5. self.sex = sex

  狭义的封装: 私有制.

  私有成员 : 私有静态字段, 私有方法, 私有对象属性

  私有静态字段:

  在类外部引用私有静态字段

  1. class Pay:
  2. __money = 1000 # 定义私有静态变量__money
  3.  
  4. def pay(self):
  5. pass
  6.  
  7. p = Pay()
  8. p.__money # 报错,在类外部对象无法引用私有静态字段__money
  9. Pay.__money # # 报错,在类外部类名无法引用私有静态字段__money

  在类内部引用私有静态字段

  1. class Pay:
  2. __money = 1000 # 定义私有静态变量__money
  3.  
  4. def pay(self):
  5. print(p.__money) # 在类内部对象可以引用私有静态字段__money
  6. print(Pay.__money) # 在类内部类名可以引用私有静态字段__money
  7.  
  8. p = Pay()
  9. p.pay()
  10. #
  11. #

  在子类引用私有静态字段

  1. class Money:
  2. __money = 1000 # 定义私有静态变量__money
  3.  
  4. class Pay(Money):
  5.  
  6. def pay(self):
  7. pass
  8. print(p.__money) # 在子类内部对象不能引用父类的私有静态字段__money
  9. print(Pay.__money) # 在子类内部类名不能引用父类的私有静态字段__money
  10.  
  11. p = Pay()
  12. # p.__money # 子类的对象无法引用父类的私有静态字段__money
  13. # Pay.__money # 子类名无法引用父类的私有静态字段__money
  14. p.pay()

  总结:对于私有静态字段来说,只能在本类中内部访问,类的外部,派生类(子类)均不可访问.

  1. # 可以访问,但是工作中千万不要用 : '__类名私有静态字段'
  2. # print(Pay._Pay__money)
  3. # print(Pay.__dict__)

  私有方法:对于私方法来说,只能在本类中内部访问,类的外部,派生类(子类)均不可访问.

  1. class B:
  2. def __f1(self):
  3. print('')
  4.  
  5. class A(B):
  6. def __func(self):
  7. print('')
  8.  
  9. def func1(self):
  10. self.__func() # 类内部可以访问
  11. self.f1() # 子类无法访问父类的私有方法
  12.  
  13. a = A()
  14. # a.__func() # 类外部对象不能访问
  15. # A.__func() # 类外部类名不能访问
  16. a.func1()
  17. #
  18. #

  私有属性

  1. class A:
  2.  
  3. def __init__(self,name,age,weight):
  4.  
  5. self.name = name
  6. self.__age = age
  7. self.__weight = weight
  8. def func(self):
  9. print(self.__age) #类内可以引用私有属性
  10. a1 = A('jsck',18,45)
  11. print(a1.name)
  12. print(a1.__dict__) # {'name': 'jsck', '_A__age': 18, '_A__weight': 45}
  13. # print(a1.__age) # 类外无法引用私有属性
  14. a1.func()

  面试题

  1. class Parent:
  2. def __func(self):
  3. print('in Parent func')
  4.  
  5. def __init__(self): # 自动执行__init__方法
  6. self.__func() # self.__func() =>> self.__Parent__func
  7.  
  8. class Son(Parent):
  9. def __func(self):
  10. print('in Son func')
  11.  
  12. son1 = Son() # in Parent func

python面向对象 : 抽象类(接口类),多态,封装(私有制封装)的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装

    抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...

  2. Python面向对象之接口类(抽象类)

    Python面向对象之接口类(抽象类):就是制定一个规范. 比如定义了一个接口类(抽象类)(他们是不可以进行实例化的,这就是他为什么是制定一个规范的原因). 他的定义是需要abc模块,要变的就是他的方 ...

  3. python day - 19 抽象类 接口类 多态 封装

    一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...

  4. python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)

    一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...

  5. python笔记5 接口类抽象类 封装 反射 设计模式 模块 :random随机数 josn shelve持久化存储

    接口类抽象类 接口类:接口类就是制定一个规则,让其他人按照我的规则去写程序. #!/usr/bin/env python from abc import ABCMeta,abstractmethod ...

  6. Python面向对象 | 抽象类和接口类

    一.抽象类(规范的编程模式) 什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化.抽象类的本质还是类,指的是一组类的相似性,而接口只强调函数属性的相似性. 为什么要有抽象类 ...

  7. Python面向对象初始(三大特征,多态,继承,封装)

    Python面向对象的初始 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的 ...

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

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

  9. Python面向对象06 /元类type、反射、函数与类的区别、特殊的双下方法

    Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 目录 Python面向对象06 /元类type.反射.函数与类的区别.特殊的双下方法 1. 元类type 2. 反射 3 ...

随机推荐

  1. struts2参数转换器用法---2

    //第二种转换器写法public class PointConvert2 extends StrutsTypeConverter{ @Override public Object convertFro ...

  2. Go Example--限速

    package main import ( "fmt" "time" ) func main() { requests := make(chan int, 5) ...

  3. SQLite数据库下载

    一:SQLite简介 SQLite是一种嵌入式数据库,它的数据库就是一个文件.体积很小,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以集成. 要操作关系数据库,首先需要连接到 ...

  4. C# to IL 4 Keywords and Operators(关键字和操作符)

    Code that is placed after the return statement never gets executed. In the first programgiven below, ...

  5. mysql数据库优化方法大数据量查询轻松解决

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  6. 如何利用 Chrome 来模拟移动网络来调试 FastAdmin 网站

    如何利用 Chrome 来模拟移动网络来高度 FastAdmin 网站 因为目前大多数都在开发移动类的网页,所以客户端的速度下载速度要也考虑. 虽然都已经 4G 了,但还是要看看在网络质量很差的情况 ...

  7. JMeterPlugins插件监听器学习-监听器

    JMeterPlugins插件监听器学习-监听器 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表)2.jp@gc - AutoStop List ...

  8. jmeter ---处理Cookie与Session

    有些网站保存信息是使用Cookie,有些则是使用Session.对于这两种方式,JMeter都给予一定的支持. 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: ...

  9. hadoop商业版本的选择介绍

    记得刚接触到hadoop的时候跟大部分人一样都会抱怨hadoop的安装部署问题,对于一个新手来说这这的是个头疼的问题,可能需要花费一整天的时间才能把分布式环境安装配置好.在刚接触hadoop的一段时间 ...

  10. OpenCV相机标定坐标系详解

    在OpenCV中,可以使用calibrateCamera函数,通过多个视角的2D/3D对应,求解出该相机的内参数和每一个视角的外参数. 使用C++接口时的输入参数如下: objectPoints - ...