python_day_19

今日主要内容:

  • 1.抽象类,接口类
  • 2.多态
  • 3.封装

1.抽象类,接口类

python 没有接口这个概念
接口类,抽象类: 制定一个规范. 举个栗子:
你的项目经理提一个需求,让你做一个支付功能.
第一版:
class Alipay:
def __init__(self,money):
self.money = money def pay(self):
print('使用支付宝支付了%s' %self.money) class Jdpay:
def __init__(self, money):
self.money = money def pay(self):
print('使用京东支付了%s' % self.money) a1 = Alipay(200)
a1.pay() j1 = Jdpay(100)
j1.pay()

经理看了,然后让你改进,让你支付的方式一样

第二版:

class Alipay:
def __init__(self,money):
self.money = money def pay(self):
print('使用支付宝支付了%s' %self.money) class Jdpay:
def __init__(self, money):
self.money = money def pay(self):
print('使用京东支付了%s' % self.money) def pay(obj):
obj.pay() a1 = Alipay(200)
j1 = Jdpay(100)
pay(a1) # 归一化设计
pay(j1)

第三版,野生程序员来了.......要增加一个微信支付的功能.
class Alipay:
def __init__(self,money):
self.money = money def pay(self):
print('使用支付宝支付了%s' %self.money) class Jdpay:
def __init__(self, money):
self.money = money def pay(self):
print('使用京东支付了%s' % self.money) class Wechatpay: def __init__(self,money):
self.money = money def weixinpay(self):
print('使用微信支付了%s' % self.money) def pay(obj):
obj.pay() a1 = Alipay(200)
j1 = Jdpay(100)
pay(a1) # 归一化设计
pay(j1) w1 = Wechatpay(300)
w1.weixinpay()

经理看了觉得很乱,打回去重新修改,制定规则,抽象类,接口类
第四版:
from abc import ABCMeta,abstractmethod

class Payment(metaclass=ABCMeta):  # 抽象类(接口类):
@abstractmethod
def pay(self): pass # 制定了一个规范 class Alipay(Payment):
def __init__(self,money):
self.money = money def pay(self):
print('使用支付宝支付了%s' %self.money) class Jdpay(Payment):
def __init__(self, money):
self.money = money def pay(self):
print('使用京东支付了%s' % self.money) class Wechatpay(Payment): def __init__(self,money):
self.money = money def pay(self):
print('使用微信支付了%s' % self.money) def pay(obj):
obj.pay()
w1 = Wechatpay(200)
a1 = Alipay(200)
j1 = Jdpay(100)
pay(a1) # 归一化设计
pay(j1)
pay(w1)

2.多态.

python面向对象的三大特征之一:
多态: python处处是多态.

python:弱类型语言
python 不管什么类型,传入函数,封装到对象中都可以.
python的鸭子类型.
鸭子类型 : 看着像鸭子,他就是鸭子.
以下这些类 都互称为鸭子.
class Str:
def index(self):
pass class List:
def abc(self):
pass class Tuple:
def rrr(self):
pass
3.封装
广义的封装: 实例化一个对象,给对象空间封装一些属性.
狭义的封装: 私有制.
私有成员:私有静态字段,私有方法,私有对象属性
私有静态字段
class B:
__money = 100000 class A(B):
name = 'alex'
__age = 1000 def func(self):
print(self.__age)
print(A.__age) # 对于私有静态字段,类的内部可以访问.
print('func....')
def func1(self):
print(self.__money)
print(A.__money)
a1 = A()
print(a1.name)
print(A.name) print(a1.__age) # 实例化对象不能访问私有静态字段
print(A.__age) # 类名不能访问私有静态字段
对于私有静态字段,类的外部不能访问. a1.func() #对于私有静态字段,类的内部可以访问. a1.func1() #对于私有静态字段来说,只能在本类中内部访问,类的外部,派生类均不可访问. #可以访问,但是工作中千万不要用.
print(A._A__age)
print(A.__dict__) #私有方法 class B:
__money = 100000
def __f1(self):
print('B') class A(B):
name = 'alex' def __func(self):
print('func....') def func1(self):
# self.__func() # 类的内部可以访问
self.__f1()
a1 = A()
a1.__func() # 类外部不能访问
a1.func1() # 类的内部可以访问
a1.func1() # 类的派生类也不能访问.

私有对象属性同私有方法和私有静态字段,类外部不能访问,类的内部可以访问,类的派生类也不能访问.

补充一个面试题:
3,下面代码执行结果是什么?为什么?
class Parent:
def func(self):
print('in Parent func') def __init__(self):
self.func() class Son(Parent):
def func(self):
print('in Son func') son1 = Son()

流程图;

结果图;

原因:

因为Son(),是实例化过程,然后自动执行__init__函数,Son类里没有,去父类里找,然后执行父类的__init__方法,执行func方法,先从自己的类中找,有func,执行func,
打印in Son func 补充知识点:
MRO-C算法-python多继承原理
class H:

    def bar(self):
print('F.bar')
class G(H): def bar(self):
print('F.bar')
class F(H): def bar(self):
print('F.bar')
class E(G): def bar(self):
print('E.bar') class D(F): def bar(self):
print('D.bar') class C(E):
def bar(self):
print('C.bar') class B(D): def bar(self):
print('B.bar') class A(B, C, D): def bar(self):
print('A.bar') a = A()
print(A.mro())

流程图;

执行过程:

A(B,C,D)

首先找到A继承的三个类的深度继承顺序,放到一个列表中
L[B] = [B,D,F,H] #B往上面的继承顺序
L[C] = [C,E,G,H] #C往上面的继承顺序
L[D] = [D,F,H] #D往上面的继承顺序

第二步:A自己的广度,第一层
L[A] = [B,C,D]

每个列表的第一个元素为头部,从第一个列表的头部开始找,找其他列表中尾部是否含有
这个类名,如果没有,提取出来放到一个列表中,如果有,找下一个列表的头部,循环下去
只要提取来一个,我们就从第一个列表的头部接着重复上面的操作.
1 [B,D,F,H] [C,E,G,H] [D,F,H] [B,C,D]
2 [D,F,H] [C,E,G,H] [D,F,H] [C,D] #提取了头部的B,然后将其他列表头部的B删除,并将B放到list中
3 [D,F,H] [E,G,H] [D,F,H] [D] #因为第一个列表的D在其他列表的尾部存在,所以跳过D,然后找第二个列表的头部C,提取了头部的C,然后将其他列表头部的B删除,并将B放到list中

.......

4 [H] [H] [H] []

list = [A,B,C,D,F,E,G,H,O]


2018-07-26  17:41:25

python全栈开发-面向对象-进阶2的更多相关文章

  1. python全栈开发-面向对象-进阶

    python_day_18 1,面向对象的三大特性是什么?继承,多态,封装2,什么是面向对象的新式类?什么是经典类?凡是继承object类都是新式类.凡是不继承object类都是经典类.3,面向对象为 ...

  2. python全栈开发-面向对象-初识

    python_16_day 函数总结: https://www.processon.com/view/link/5b718274e4b0555b39e1055f 面向过程的程序设计的核心是过程(流水线 ...

  3. python全栈开发-面向对象-初识2

    python_17_day 今日主要内容: 1.类空间,对象空间,查询顺序. 2.组合. 1.类空间,对象空间,查询顺序. class Person: animal = '高级动物' soul = ' ...

  4. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  5. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

  6. python 全栈开发,Day99(作业讲解,DRF版本,DRF分页,DRF序列化进阶)

    昨日内容回顾 1. 为什么要做前后端分离? - 前后端交给不同的人来编写,职责划分明确. - API (IOS,安卓,PC,微信小程序...) - vue.js等框架编写前端时,会比之前写jQuery ...

  7. Python全栈开发相关课程

    Python全栈开发 Python入门 Python安装 Pycharm安装.激活.使用 Python基础 Python语法 Python数据类型 Python进阶 面向对象 网络编程 并发编程 数据 ...

  8. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  9. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

随机推荐

  1. Kali-linux使用Easy-Creds工具攻击无线网络

    Easy-Creds是一个菜单式的破解工具.该工具允许用户打开一个无线网卡,并能实现一个无线接入点攻击平台.Easy-Creds可以创建一个欺骗访问点,并作为一个中间人攻击类型运行,进而分析用户的数据 ...

  2. RedHat(小红帽)下 yum用不了的解决办法

    由于RedHat是商业版的,通常由于没有注册,导致yum程序无法使用(linux下面,yum是个安装软件的“神器”).此时可用CentOS的地址进行替换.下面将一步步说明如何处理: 一.删除RedHa ...

  3. rocketmq搭建

    maven参数:  mvn -Prelease-all -DskipTests clean install -U

  4. Activation Functions

    Sigmoid Sigmoids saturate and kill gradients. Sigmoid outputs are not zero-centered. Exponential fun ...

  5. a^b%c 小技巧

    我们知道像a^b这种数在计算的时候由于大的增长速度非常快,所以常常越界,所以非常多题目在出的时候都会让我们取模. a^b = a*a*a*a--(一共b个a相乘):我们前一篇文章在说两个数相乘的时 , ...

  6. c/s和b/s结构的区别

    c/s结构 1.创建Client 2.设计服务器Server 3.设计私有通讯协议 4.随着功能的升级,安装了客户端程序的计算,要不升级最新版 b/s结构 1.浏览器代替客户端 2.服务器(协议教会, ...

  7. iOS背景音乐不自动播放

    iOS 内置浏览器safari不允许自动播放音乐.我们需要通过WeixinJSBridgeReady()函数实现自动触发 document.addEventListener("WeixinJ ...

  8. MySQL慢日志查询实践

    慢日志查询作用 慢日志查询的主要功能就是,记录sql语句中超过设定的时间阈值的查询语句.例如,一条查询sql语句,我们设置的阈值为1s,当这条查询语句的执行时间超过了1s,则将被写入到慢查询配置的日志 ...

  9. PHP实现多继承 trait 语法

    原文地址:http://small.aiweimeng.top/index.php/archives/50.html PHP没有多继承的特性.即使是一门支持多继承的编程语言,我们也很少会使用这个特性. ...

  10. pyhton3解决"tuple parameter unpacking is not supported"问题

    准备将键值对中的键与值对调,结果第10行出了bug,显示"tuple parameter unpacking is not supported" 解决方法:将map(lambda( ...