Python进阶-XVII 非python的接口类、多态、python自己的封装
1、python模拟java中的接口类
python中是没有接口类的概念的,因为它支持多继承,但是java不能,所以就提出一个接口类的概念
java : 面向对象编程
设计模式 —— 接口
接口类 : python原生不支持
抽象类 : python原生支持的
例子:有三种特性,能走,能飞,能游泳,如下三个类,就有了类似java中接口类的作用了。
class Fly:pass
class Walk:pass # 用多继承,可以表明一个动物的多个本领
class Swan(Fly, Walk):pass
class Dog(Walk):pass # 上面只是模拟,真实情况下不是这样使用,而是使用语法糖@abstarctmethod来实现。规范代码用!
from abc import ABCMeta,abstractmethod
class Swim(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass class Fish(Fly):
def swim(self): # 如果不实现该方法,会报错:TypeError: Can't instantiate abstract class Fish with abstract methods swim
print('eagle fling') eagle = Fish()
继续举例:
class Wechat(Payment):
def pay(self,money):
print('已经用微信支付了%s元'%money) class Alipay(Payment):
def pay(self,money):
print('已经用支付宝支付了%s元' % money) class Applepay(Payment):
def pay(self,money):
print('已经用applepay支付了%s元' % money) def pay(pay_obj,money): # 统一支付入口
pay_obj.pay(money) # wechat = Wechat()
# ali = Alipay()
app = Applepay()
# wechat.pay(100)
# ali.pay(200)
#p = Payment() #TypeError: Can't instantiate abstract class Payment with abstract methods pay
接口类就是多继承
# tiger 走路 游泳
# swan 走路 游泳 飞
# oldying 走路 飞
from abc import abstractmethod,ABCMeta
class Swim_Animal(metaclass=ABCMeta):
@abstractmethod
def swim(self):pass class Walk_Animal(metaclass=ABCMeta):
@abstractmethod
def walk(self):pass class Fly_Animal(metaclass=ABCMeta):
@abstractmethod
def fly(self):pass class Tiger(Walk_Animal,Swim_Animal):
def walk(self):
pass
def swim(self):
pass
class OldYing(Fly_Animal,Walk_Animal):pass
class Swan(Swim_Animal,Walk_Animal,Fly_Animal):pass # 接口类 刚好满足接口隔离原则 面向对象开发的思想 规范
2、强类型语言中的多态
什么是多态
python 动态强类型的语言
鸭子类型
list tuple
不崇尚根据继承所得来的相似
我只是自己实现我自己的代码就可以了。
如果两个类刚好相似,并不产生父类的子类的兄弟关系,而是鸭子类型
list tuple 这种相似,是自己写代码的时候约束的,而不是通过父类约束的
优点 : 松耦合 每个相似的类之间都没有影响
缺点 : 太随意了,只能靠自觉
class Payment:pass class Alipay():
def pay(self,money):
print('已经用支付宝支付了%s元' % money) class Applepay():
def pay(self,money):
print('已经用applepay支付了%s元' % money) def pay(pay_obj,money): # 统一支付入口 归一化设计
pay_obj.pay(money) pay()
因为强类型语言,传参时必须指定参数类型!
而python不必如此,天生支持多态,因为它是动态的强类型语言,在传参时没有要求指定类型! 多态 python 天生支持多态
class List():
def __len__(self):pass
class Tuple():
def __len__(self):pass def len(obj):
return obj.__len__() l = Tuple()
len(l) # 强类型语言 多态
# python 语言 鸭子类型 # 接口类和抽象类 在python当中的应用点并不是非常必要
3、抽象类
抽象类 : 规范
一般情况下 单继承 能实现的功能都是一样的,所以在父类中可以有一些简单的基础实现
多继承的情况 由于功能比较复杂,所以不容易抽象出相同的功能的具体实现写在父类中 抽象类还是接口类 : 面向对象的开发规范 所有的接口类和抽象类都不能实例化
java :
java里的所有类的继承都是单继承,所以抽象类完美的解决了单继承需求中的规范问题
但对于多继承的需求,由于java本身语法的不支持,所以创建了接口Interface这个概念来解决多继承的规范问题 python
python中没有接口类 :
python中自带多继承 所以我们直接用class来实现了接口类
python中支持抽象类 : 一般情况下 单继承 不能实例化
且可以实现python代码
#一切皆文件
import abc #利用abc模块实现抽象类 class All_file(metaclass=abc.ABCMeta):
all_type='file'
@abc.abstractmethod #定义抽象方法,无需实现功能
def read(self):
'子类必须定义读功能'
with open('filaname') as f:
pass @abc.abstractmethod #定义抽象方法,无需实现功能
def write(self):
'子类必须定义写功能'
pass 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)
4、python自己的封装
广义上面向对象的封装 :代码的保护,面向对象的思想本身就是一种
只让自己的对象能调用自己类中的方法 狭义上的封装 —— 面向对象的三大特性之一
属性 和 方法都藏起来 不让你看见
class A:
name = 'jack'
def get(self):
return A.name print(A.name)
a = A()
print(a.get()) class B:
__name = 'tom' # 私有化的属性
def __get(self): # 私有化的方法,外边不能访问
return A.name def get(self): # 共有方法,调用私有方法
self.__get() #print(B.__name) # AttributeError: type object 'B' has no attribute '__name'
b = B()
#print(b.__get()) # AttributeError: 'B' object has no attribute '__get'
b.get() class Person:
__key = 123 # 私有静态属性
def __init__(self,name,passwd):
self.name = name
self.__passwd = passwd # 私有属性 def __get_pwd(self): # 私有方法
return self.__passwd #只要在类的内部使用私有属性,就会自动的带上_类名 def login(self): # 正常的方法调用私有的方法
self.__get_pwd() alex = Person('alex','alex3714')
print(alex._Person__passwd) # _类名__属性名
#print(alex.get_pwd())
所有的私有 都是在变量的左边加上双下划綫
对象的私有属性
类中的私有方法
类中的静态私有属性
所有的私有的 都不能在类的外部使用
Python进阶-XVII 非python的接口类、多态、python自己的封装的更多相关文章
- python 全栈开发,Day21(抽象类,接口类,多态,鸭子类型)
一.昨日复习 派生方法和派生属性 super 只有在子父类拥有同名方法的时候, 想使用子类的对象调用父类的方法时,才使用super super在类内 : super().方法名(arg1,..) 指名 ...
- Python进阶(十四)----空间角度研究类,类与类之间的关系
Python进阶(十四)----空间角度研究类,类与类之间的关系 一丶从空间角度研究类 对象操作对象属性 class A(): address = '沙河' def __init__(self, na ...
- Python学习日记(二十五) 接口类、抽象类、多态
接口类 继承有两种用途:继承基类的方法,并且做出自己的改变或扩展(代码重用)和声明某个子类兼容于某基类,定义一个接口类interface,接口类中定义了一些接口名(就是函数名)且并未实现接口的功能,子 ...
- python面向对象 : 抽象类(接口类),多态,封装(私有制封装)
一. 抽象类(接口类) 与java一样, python也有抽象类的概念但是同样需要借助模块实现,抽象类是一个特殊的类, 它的特殊之处在于只能被继承, 不能被实例化. 从设计角度去看, 如果类是从现实对 ...
- 【学习笔记】--- 老男孩学Python,day18 面向对象------抽象类(接口类), 多态, 封装
抽象类,接口类 Python没有接口这个概念 抽象类(接口类): 目的是制定一个规范 要学会归一化设计,有重复的东西就要想把它们合并起来 from abc import ABCMeta, abstra ...
- python day - 19 抽象类 接口类 多态 封装
一. 抽象类接口类即制定一个规范 特点: 1.不可被实例化. 2.规范子类当中必须事先某个方法. 3.在python中有原生实现抽象类的方法,但没有原生实现接口类的方法. 例题:制定一个规范就是,子类 ...
- Python进阶丨如何创建你的第一个Python元类?
摘要:通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类. Python元类设置类的行为和规则.元类有助于修改类的实例,并且相当复杂,是Python编程的高级功能之一. ...
- python 进阶篇 函数装饰器和类装饰器
函数装饰器 简单装饰器 def my_decorator(func): def wrapper(): print('wrapper of decorator') func() return wrapp ...
- python之继承、抽象类、派生、多态、组合、封装
1.继承概念的实现方式主要有2类:实现继承.接口继承. Ø 实现继承是指使用基类的属性和方法而无需额外编码的能力: Ø 接口继承是指仅使用属性和方法的名称.子类必须提供 ...
随机推荐
- 移动端px自动转化为rem
注:不转换的px用大写PX代替 lib-flexible 作用:让网页根据设备dpr和宽度,利用viewport和html根元素的font-size配合rem来适配不同尺寸的移动端设备 安装:cnpm ...
- 微信小程序开发——websocket测试
服务端 在windows下执行 node server.js 也可参照我的前一篇部署https var httpServ = require('http') var WebSocketServer ...
- golang数据结构之用循环链表解决约瑟夫环问题
josephu.go package link import ( "fmt" ) type Kid struct { ID int next *Kid } func AddKid( ...
- JdbcTemplate经典案例
一.JdbcTemplate案例配置式 (1)导入依赖 <dependency> <groupId>org.springframework</groupId> &l ...
- settings.py相关配置
INSTALLED_APPS #配置项目绑定的应用 TEMPLATES #配置项目使用的模板引擎 DATABASES #设定绑定的数据库 TIME_ZONE #设定时区,时区的设定可能 ...
- JBoss+eclipes之HelloWorld
网上罕有教程,文档看不太懂.鄙人摸索成功以记之. 创建新的EJB项目:[File]--[New]--[Other]-- [EJB]--[EJB project] 此处可见我的JBoss服务器使用的是W ...
- H3C DRNI学习
DRNI:Distributed Resilient Network Interconnect,分布式弹性网络互连.DR:分布式聚合接口IPP:内部控制链路端口IPL:内部控制链路DRCP报文:分布式 ...
- d03
回顾: 两个环境 工具环境:Jmeter的下载.启动.基本使用 项目环境:学生信息管理系统 两种接口: 天气预报:4个接口----GET方法 学生信息管理系统: 被测软件的学院信息接口: 4类: 查询 ...
- 错误InnoDB:Attemptedtoopenapreviouslyopenedtablespace.
2013-08-04 13:48:22 760 [ERROR] InnoDB: Attempted to open a previously opened tablespace. Previous t ...
- MVC教程:MVC区域路由
一.区域路由 为了管理网站中大量的文件,在ASP.NET MVC 2.0版本中引入了一个新概念:区域(Area). 有了区域以后,可以让我们的项目不至于太复杂而导致管理混乱.每个模块的页面都放入相应的 ...