day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析
day24
面向对象的三大特性
继承、封装、多态
封装:把一堆东西(代码,数据)放到一个地方(空间),并且可以使用
class Student:
def __init__(self, name, sex):
self.name = name
self.sex = sex
liye = Student("李业", "laddy_boy")
print(liye.sex)
多态:一个事物可以呈现多种形态
水:固态、液态、气态
python默认支持多态,比如变量可以是不同类型,函数的参数也可以传多种类型
鸭子类型
python崇尚鸭子类型(编程思路)看起来像鸭子,它就是鸭子
# class A:
#
# def login(self):
# print('登录')
#
# def register(self):
# print('注册')
#
# def func1(self):
# pass
#
# def func2(self):
# pass
#
#
# class B:
#
# def login(self):
# print('登录')
#
# def register(self):
# print('注册')
#
# def func3(self):
# pass
# A B互为鸭子.
# 赵嘎: 1. 好记.
# 虽然A,B两个类没有关系,但是我统一两个类中相似方法的方法名,在某种意义上统一的标准.
# index ,index, index,
类的约束
版本1
# class QQpay:
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay:
# def pay(self, money):
# print(f"使用阿里支付了{money}")
#
#
# obj1 = QQpay()
# obj1.pay(100)
#
# obj2 = Alipay()
# obj2.pay(200)
版本2:要做到统一接口
# class QQpay:
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay:
# def pay(self, money):
# print(f"使用阿里支付了{money}")
#
#
# def pay(obj, money):
# obj.pay(money)
#
#
# obj1 = QQpay()
# obj2 = Alipay()
#
# pay(obj1, 100)
# pay(obj2, 200)
版本3: 完善支付功能
# class QQpay:
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay:
# def pay(self,money):
# print(f"使用阿里支付了{money}")
#
#
# class Wechat:
# def fuqian(self, money):
# print(f"使用微信支付了{money}")
#
#
# def pay(obj, money):
# obj.pay(money)
#
#
# obj1 = QQpay()
# obj2 = Alipay()
#
# pay(obj1, 100)
# pay(obj2, 200)
#
# obj3 = Wechat()
# obj3.fuqian(300)
版本4:定制约束,约定俗称,没有做到完全强制
# class Payment:
# def pay(self, money):
# pass
#
#
# class QQpay(Payment):
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay(Payment):
# def pay(self, money):
# print(f"使用阿里支付了{money}")
#
#
# class Wechat(Payment):
# def fuqian(self, money):
# print(f"使用微信支付了{money}")
#
#
# def pay(obj, money):
# obj.pay(money)
#
# obj1 = QQpay()
# obj2 = Alipay()
# obj3 = Wechat()
#
# pay(obj1, 100)
# pay(obj2, 200)
# pay(obj3, 300)
版本5:做到强制约束
# 方法一:python语言惯于使用的一种约束方法,在父类主动抛出错误
# 方法二:借鉴于java语言,定义抽象类的概念,做到真正的强制约束
# 方法一
# 前提,你的项目已经上线了,之前完成的QQpay,Alipay 以及 pay函数这个接口都成型
# 如果此时新添加一个微信支付,其他的py文件引用支付功能时还是直接引用pay
# class Payment:
# def pay(self, money):
# raise Exception("你的子类需要定义pay方法")
#
#
# class QQpay(Payment):
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay(Payment):
# def pay(self, money):
# print(f"使用阿里支付了{money}")
#
#
# class Wechat(Payment):
# def fuqian(self, money):
# print(f"使用微信支付了{money}")
#
# # def pay(self, money):
# # print(f"使用微信支付了{money}")
#
# def pay(self, money):
# self.pay(money)
#
# qq = QQpay()
# aa = Alipay()
# ww = Wechat()
#
# pay(qq, 100)
# pay(aa, 100)
# pay(ww, 100)
# 方法二
# from abc import ABCMeta,abstractclassmethod
#
#
# class Payment(metaclass=ABCMeta):
# # def pay(self, money):
# # raise Exception("出错")
#
# @abstractclassmethod
# def pay(self, money):
# pass
#
#
# class QQpay(Payment):
# def pay(self, money):
# print(f"使用qq支付了{money}")
#
#
# class Alipay(Payment):
# def pay(self, money):
# print(f"使用阿里支付了{money}")
#
#
# class Wechat(Payment):
# def fuqian(self, money):
# print(f"使用微信支付了{money}")
#
# # def pay(self, money):
# # print(f"使用微信支付了{money}")
#
#
# def pay(self, money):
# self.pay(money)
#
#
# qq = QQpay()
# aa = Alipay()
# ww = Wechat()
#
# pay(qq, 100)
# pay(aa, 100)
# pay(ww, 100)
super的深度剖析
super(类,self)严格按照对象从属于类的mro的顺序,执行下一个类
题一
# class A:
# def f1(self):
# print("in A f1")
#
# def f2(self):
# print("in A f2")
#
#
# class Foo(A):
# def f1(self):
# # 按照self对象从属于类的mro的顺序,执行Foo类的下一个类
# super(Foo, self).f2()
# print("in A Foo")
#
#
# obj = Foo()
# obj.f1()
# in A f2
# in A Foo
题二
# class A:
# def f1(self):
# print("in A")
#
# class Foo(A):
# def f1(self):
# super(Foo, self).f1()
# print("in Foo")
#
#
# class Bar(A):
# def f1(self):
# print("in Bar")
#
#
# class Info(Foo, Bar):
# def f1(self):
# super(Info, self).f1()
# print("in Info f1")
#
#
# print(Info.mro())
# # Info Foo Bar A
# obj = Info()
# obj.f1()
# in Bar
# in Foo
# in Info f1
题三
class A:
def f1(self):
print("in A")
class Foo(A):
def f1(self):
super().f1()
print("in Foo")
class Bar(A):
def f1(self):
print("in Bar")
class Info(Foo, Bar):
def f1(self):
super(Foo, self).f1()
print("in Info f1")
obj = Info()
obj.f1()
# in Bar
# in Info f1
带颜色的print
固定的头尾: \033[ \033[0m
1;35;0m 具体调节的参数
显示方式: 0(默认值)、1(高亮)、22(非粗体)、4(下划线)、24(非下划线)、 5(闪烁)、25(非闪烁)、7(反显)、27(非反显)
前景色: 30(黑色)、31(红色)、32(绿色)、 33(黄色)、34(蓝色)、35(洋 红)、36(青色)、37(白色)
背景色: 40(黑色)、41(红色)、42(绿色)、 43(黄色)、44(蓝色)、45(洋 红)、46(青色)、47(白色)
有些功能无效
# print('字体变色,但无背景色')
# 固定的头尾: \033[ \033[0m
# 1;35;0m 具体调节的参数
# print('\033[1;32;0m字体变色,但无背景色 \033[0m') # 有高亮 或者 print('\033[1;35m字体有色,但无背景色 \033[0m')
# print('\033[1;33;0m字体变色,但无背景色 \033[0m') # 有高亮 或者 print('\033[1;35m字体有色,但无背景色 \033[0m')
# print('\033[1;45m 字体不变色,有背景色 \033[0m') # 有高亮
# print('\033[1;35;46m 字体有色,且有背景色 \033[0m') # 有高亮
print('\033[0;35;0m 字体有色,且有背景色 \033[0m')
print('\033[1;35;0m 字体有色,且有背景色 \033[0m')
print('\033[4;35;0m 字体有色,且有背景色 \033[0m')
# print('\033[5;35;0m 字体有色,且有背景色 \033[0m') # 无高亮
今日总结
多态、封装、鸭子类型 面试题
类的约束:写代码遵循的一种开发思路
抽象类、接口类:面试题
super:开发,面试都可能涉及
day24——面向对象三大特性、鸭子类型、类的约束、super的深度解析的更多相关文章
- day24 面向对象三大特性之封装
本周内容 组合 封装 多态 面向对象高级 异常处理 网络协议 通讯原理 互联网协议 TCP/UDP 基于TCP协议的套接字 上周回顾 1.xml,os,os.path 2.ATM+购物车 三层结构 3 ...
- 面向对象编程(九)——面向对象三大特性之继承以及重写、Object类的介绍
面向对象三大特性 面向对象三大特征:继承 :封装/隐藏 :多态(为了适应需求的多种变化,使代码变得更加通用!) 封装:主要实现了隐藏细节,对用户提供访问接口,无需关心方法的具体实现. 继承:很好的实现 ...
- day20面向对象三大特性 , 类嵌套
#!/usr/bin/env python# -*- coding:utf-8 -*- # 1.简述面向对象三大特性并用代码表示."""封装:class Account: ...
- python 面向对象(三大特性)
python 面向对象(初级) (思维导图 ↑↑↑↑↑) 概述: 面向过程:根据业务逻辑从上到下垒代码. 函数式:将某功能代码封装至函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类 ...
- python 面向对象三大特性(封装 多态 继承)
今天我们来学习一种新的编程方式:面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)注:Java和C#来说只支持面向对象编程,而python比较灵活即支持面 ...
- python面向对象三大特性
面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...
- [.net 面向对象编程基础] (13) 面向对象三大特性——多态
[.net 面向对象编程基础] (13) 面向对象三大特性——多态 前面两节,我们了解了面向对象的的封装和继承特性,面向对象还有一大特性就是多态.比起前面的封装和继承,多态这个概念不是那么好理解.我们 ...
- C++面向对象三大特性
面向对象三大特性 继承 public protected private public继承 public protected 不可见 private继承 private private 不可见 pro ...
- JAVA基础——面向对象三大特性:封装、继承、多态
JAVA面向对象三大特性详解 一.封装 1.概念: 将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问. 2.好处: 只能通过规定的方法访问数据. ...
随机推荐
- yugabyte与cockroachdb 的几个区别
下图是来自官方文档 说明 今天打算尝试使用yugabyte做为hasura graphql-engine 的pg 引擎,发现比较完美,仔细看官方文档,原来yugabyte 底层实现直接是基于原生pg ...
- ACM数据结构-树状数组
模板: int n; int tree[LEN]; int lowbit(int x){ return x&-x; } void update(int i,int d){//index,del ...
- AS启动模拟器时报错的解决办法
问题描述 AS安装后之后,在AVD manager 中创建了一个模拟器,并且其他的配置都正确,但是在点击run时却出现了如下的错误: 这个问题一直在报Error while waiting for d ...
- 洛谷P2577 午餐
题目链接 题意概述:有n个人,第i个人打饭消耗ai时间,离开后吃饭耗费bi时间,将n个人分成两队,合理分配人员使总时间最短并输出总时间. 我们把问题拆分为两个部分.首先是排列顺序,然后是怎么分到两个队 ...
- 实验1c语言开发环境使用和数据类型,运算符和表达式
/*this is first c program*/ # include<stdio.h> int main() { printf("Hello Mars!"); ; ...
- Linux查看文件的权限
Linux查看权限命令: ls -l 文件或文件夹 输出结果示例: 这里是查看tomcat文件夹中所有子文件或者子文件夹的权限,以列表的形式列出. 关于列表的每列所代表的含义参见我的另外一篇博客:Li ...
- 《京东上千页面搭建基石——CMS前后端分离演进史》阅读笔记
一.背景 CMS即内容管理系统,目的是用于快速进行网站建设或者网页开发. 对于京东网站部门来说,CMS核心目的是用来快速开发和上线各种页面,诸如各种垂直频道页. 二.CMS核心目的 进行数据和模板的统 ...
- 出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法
一.原因及解决方法[1] 1.原因:堆内存的永久保存去区内存分配不足(缺省默认为64M),导致内存溢出错误. 2.解决方法:重新分配内存大小,-Xms1024M -Xmx2048M -XX:PermS ...
- [Beta]Scrum Meeting#5
github 本次会议项目由PM召开,时间为5月10日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写博客整理文档 撰写博客整理文档 swoip 改进界面 改进界面 b ...
- JCR分区 | 中科院SCI期刊分区表
LetPub查询系统,非常方便,分区影响因子都可以查询,还有投稿经验可以参考. SCI全称是Science Citation Index(科学引文索引) 科睿唯安JCR分区(Journal Citat ...