一. 接口类

java:面向对象编程
设计模式 -- 接口类 接口类:python原生不支持
抽象类:python 原生支持的
from abc import abstractclassmethod,ABCMeta
class Payment(metaclass= ABCMeta): # 元类,默认元类:type
@abstractclassmethod
def pay(self, money):
raise NotImplemented # 没有实现这个方法
# Payment 规范:接口类/抽象类
# 一般使用多继承了,就用接口类
# 接口类中的所有方法都必须不能实现 -- Java
# 抽象类不支持多继承
# 抽象类中可以有一些代码的实现 -- Java class Wechat(Payment):
def pay(self, money):
print('已经使用微信支付了%s元'%money) class Alipay(Payment):
def pay(self,money):
print('已经使用支付宝支付了%s元' % money) def pay(pay_obj, money): # 统一支付入口
pay_obj.pay(money) class Applepay(Payment):
def pay(self, money):
print('已经使用applepay支付了%s元' % money)
wechat = Wechat()
# wechat.pay(100) ali = Alipay()
# ali.pay(200) app = Applepay()
# app.fuqian(199) pay(wechat,100)
pay(ali,100)
pay(app,199)
tiger:走路,游泳           # 老虎
swan:走路,游泳,飞 # 天鹅
oldying:走路,飞 # 老鹰
from abc import abstractclassmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractclassmethod
def swim(self):
pass class Walk_Animal(metaclass=ABCMeta):
@abstractclassmethod
def walk(self):
pass class Fly_Animal(metaclass=ABCMeta):
@abstractclassmethod
def fly(self):
pass class Tiger(Walk_Animal, Swim_Animal):
def walk(self):
pass
def swim(self):
pass class Swan(Walk_Animal, Swim_Animal, Fly_Animal):
def walk(self):
pass
def swim(self):
pass
def fly(self):
pass
class Oldying(Walk_Animal, Fly_Animal):
def walk(self):
pass
def fly(self):
pass
# 接口类
# 原则:接口隔离原则:使用多个专门的接口,而不是使用单一的总接口,即客户端不应该依赖那些不需要的接口
# 面向对象开发的思想、规范

二. 抽象类

# 一切皆文件
import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
with open('fileName') as f:
pass @abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass
class Txt(All_file):
pass t1=Txt() #报错,子类没有定义抽象方法
class Txt(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('文本数据的读取方法') def write(self):
print('文本数据的读取方法') class Sata(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('硬盘数据的读取方法') def write(self):
print('硬盘数据的读取方法') class Process(All_file): #子类继承抽象类,但是必须定义read和write方法
def read(self):
print('进程数据的读取方法') def write(self):
print('进程数据的读取方法') wenbenwenjian=Txt() yingpanwenjian=Sata() jinchengwenjian=Process() #这样大家都是被归一化了,也就是一切皆文件的思想
wenbenwenjian.read()
yingpanwenjian.write()
jinchengwenjian.read() print(wenbenwenjian.all_type)
print(yingpanwenjian.all_type)
print(jinchengwenjian.all_type)
抽象类:规范
一般情况下,是单继承,能实现的功能都是一样的 ,所以在父类中可以有一些简单的基础实现
多继承的情况,由于功能比较复杂,所以不容易抽象出相同的功能的具体实现 写在父类中 不管是抽象类还是接口类:都是面向对象的开发规范
python中没有接口类。在Java中,有接口interface这个概念,是因为Java中不支持多继承。
python中自带多继承,所以我们直接用class来实现了接口类
python中支持抽象类: 一般情况下为 单继承 ,且可以实现python代码
接口类和抽象类都不能实现实例化 Java:
java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
但对于多继承的需求,由于Java本身语法的不支持,所以创建了接口interface这个概念来解决多继承的问题。

三. 多态

多态 python 天生支持多态
其他语言中:
def func(int num, str name):
pass
func(2,'alex') class Payment():pass
class Alipay(Payment):
def pay(self,money):
print('已经使用支付宝支付了%s元' % money) def pay(Payment pay_obj, int money):
pay_obj.pay(money) class Applepay(Payment):
def pay(self, money):
print('已经使用applepay支付了%s元' % money)
实现了多态
什么是多态?
多态指的是一类事物有多种形态
文件有多种形态:文本文件,可执行文件
动物有多种形态:人,狗,猪
 python 动态强类型的语言
python崇尚 鸭子类型
list tuple class foo:
def slice(self):pass
def index(self):pass class list(foo):
def slice(self):pass
def index(self):pass
class tuple(foo):
def slice(self):pass
def index(self):pass
鸭子类型不崇尚根据继承所得来的相似
而是只是自己实现自己的代码就可以了
如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的
优点:松耦合 (每个相似的类之间都没有影响)
缺点:太随意了,只能靠自觉 接口类和抽象类在python中的应用点并不是非常必要

四. 封装

广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装
只让自己的对象能调用自己类中的方法 狭义上的封装 -- 面向对象的三大特性之一
把 属性 和 方法 都藏起来 ,不让你看见
class Person:
__key = 123 # 私有的静态属性
def __init__(self,name, password):
self.name = name
self.__password = password # 私有属性:前面加上双下划线 def __get_pwd(self): # 私有方法
print(self.__dict__)
return self.__password # 只要在类的内部使用私有属性,就会自动的带上_类名 def login(self): # 正常的方法调用私有的方法
self.__get_pwd() alex = Person('alex','alex3714')
# print(alex.__password)
print(alex.__dict__) # {'name': 'alex', '_Person__password': 'alex3714'}
# print(alex._Person__password) # alex3714 可以这样调,但不能这么用(_类名__属性名)
alex.__high = 1
print(alex.get_pwd()) # {'name': 'alex', '_Person__password': 'alex3714', '__high': 1}
print(alex.__high)
所有的私有,都是在变量的左边加上双下划线
对象的私有属性
类中的私有方法
类中的静态属性
所有的私有的,都不能在类的外部使用

python学习之老男孩python全栈第九期_day025知识点总结——接口类、抽象类、多态、封装的更多相关文章

  1. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  2. python学习之老男孩python全栈第九期_day023知识点总结——类和对象命名空间、组合

    一. 类和对象命名空间类里 可以定义两种属性: 1. 静态属性 2. 动态属性 class Course: language = 'Chinese' def __init__(self, teache ...

  3. python学习之老男孩python全栈第九期_day019知识点总结——collections模块、时间模块、random模块、os模块、sys模块

    一. collections模块 在内置数据类型(dict.list.set.tuple)的基础上,collections模块还提供了几个额外的数据类型:namedtuple.deque.Counte ...

  4. python学习之老男孩python全栈第九期_day017知识点总结——初识递归、算法

    一. 递归函数 如果一个函数在内部调用自身本身,这个函数就是递归函数. 最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改 def func(n ...

  5. python学习之老男孩python全栈第九期_day010知识点总结

    def qqxing(l = []): # 可变数据类型 l.append(1) print(l)qqxing() # [1]qqxing([]) # [1]qqxing() # [1, 1]qqxi ...

  6. python学习之老男孩python全栈第九期_day007知识点总结

    基础数据类型汇总 1. str 2. int 3. list 4. bool 5. dict (1) fromkeys Python 字典 fromkeys() 方法用于创建一个新的字典,并以可迭代对 ...

  7. python学习之老男孩python全栈第九期_day001知识点总结

    1. Python2与Python3的区别: Python2:源码不标准,混乱,重复代码太多: Python3:统一标准,去除重复代码. 编码方式: python2的默认编码方式为ASCII码:pyt ...

  8. python学习之老男孩python全栈第九期_day014知识点总结

    # 迭代器和生成器# 迭代器 # 双下方法:很少直接调用的方法,一般情况下,是通过其他语法触发的# 可迭代的 --> 可迭代协议:含有__iter__的方法( '__iter__' in dir ...

  9. python学习之老男孩python全栈第九期_day016知识点总结

    '''数据类型:intbool... 数据结构:dict (python独有的)listtuple (pytho独有的)setstr''' # reverse() 反转l = [1,2,3,4,5]l ...

随机推荐

  1. idea部署tomcat:tomee required to support ear/ejb de。。

    要确定artifact 的type是使用的web application :exploded类型,使用javaee application :exploded就会报这个错误.

  2. 总结day11 ----函数的学习(2)

    内容大纲 一: 函数的运行 二: 闭包 三: 迭代器 四: 生成器 五: 列表生成器 六: 列表推导式 七: 生成器表达式 八: 匿名函数 一: 函数的运行 1:函数名是一个特殊变量 def func ...

  3. python中type、class、object的区别

    type 一. type可以用来返回一个对象的类型 例如: 二. 由于Python中一切皆对象,也就是说Python中的任何变量类型都是可以被修改的,这也是Python等动态编程语言的特点.type的 ...

  4. C#-类-string/Manth/Random/DateTime-及练习

    类一.string类:.Length 字符串的长度 .Trim() 去掉开头以及结尾的空格.TrimStart() 去掉开头的空格.TrimEnd() 去掉结尾的空格 .ToLower() 全部转换为 ...

  5. ui2-3

    2016.9讲义 一.课程的主要内容和目的 二.课程所用工具软件——Photoshop CS6 1. Photoshop 的发展史 1990.2,ps1.0问世,1991.2,PS2.0发行,此后,进 ...

  6. RocketMQ之NameServer学习笔记

    org.apache.rocketmq.namesrv.NamesrvController NameserController,NameServer的核心控制类. 1.1 NamesrvConfig ...

  7. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  8. Android中通过xml改变背景及文字颜色

    原创文章,转载请注明出处,谢谢! 本篇主要介绍Android开发中,通过XML资源文件来设置控件在不同状态下的背景及文字颜色.关于xml改变背景及文字颜色的原理,大家可以去看一下郭霖大神的源码分析文章 ...

  9. Java项目打包成exe的详细教程

    Java项目打包成exe的详细教程 把Java项目打包成exe共分为以下两步: 1. 利用Eclipse先把Java项目先打成jar包 2. 利用exe4j工具把jar包转成exe 这里以Java项目 ...

  10. gcc对open(2)支持重载吗

    在Linux中,如果man -s2 open, 我们看到两种不同的函数原型声明: $ man -s2 open NAME open, creat - open and possibly create ...