python之封装与扩展性
1.封装与扩展性
封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用的代码;而外部使用者只知道一个接口(函数),只要接口(函数)名,参数不变,使用者的代码永远无需改变。这就提供了一个良好的合作基础——或者说,只要这个基础约定不变,则代码改变不足为虑。
def __init__(self,width,length): self.width=width self.length=length def area(self):#对外提供了接口,隐藏了内部的实现细节,此时求的是面积 return self.width*self.length #使用者 r1=Room(30,20) print(r1) print(r1.area())#使用者调用接口area <__main__.Room object at 0x03720650> 600
#类的设计者,轻松的扩展了功能,而类的使用者完全不需要更改自己的代码
class Room: def __init__(self,width,length,higt): self.width=width self.length=length self.higth=higt def area(self): return self.length*self.width*self.higth #对外提供的接口,隐藏内部实现,此时求的是体积,内部逻辑变了,只需要修改一行 # 就可以实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了 r2=Room(30,20,20) print(r2) print(r2.area()) <__main__.Room object at 0x039B0750> 12000
2.静态封装
Staticmethod 使用方法
静态方法是一种普通函数,位于类定义的命名空间中,不会对任何实例类型进行操作,python为我们内置了函数staticmethod来把类中的函数定义成静态方法
class Foo: @staticmethod#装饰器,实例在使用时丧失了自动传值的机制 def spam(x,y,z):#把函数spam做成静态方法 print(x,y,z) f1=Foo() f1.spam(1,2,3)#此时函数中有几个参数就需要传几个值 1 2 3
应用场景
import time class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day @staticmethod def now():#用Date.now()的形式去产生实例,该实例是当前的时间 t=time.localtime()#获取结构式的时间格式 return Date(t.tm_year,t.tm_mon,t.tm_mday)#新建实例并返回 @staticmethod def tomorrow():#用Date.now()的形式去产生实例,该实例是明天的时间 t=time.localtime(time.time()+86400) return Date(t.tm_year,t.tm_mon,t.tm_mon) a=Date(1987,11,22)#自己定义时间 b=Date.now()#采用当前时间 c=Date.tomorrow()#采用明天的时间 print(a.year,a.month,a.day) print(b.year,b.month,b.day) print(c.year,c.month,c.day) 1987 11 22 2017 4 22 2017 4 23
@staticmethod相当于给类(类的功能:属性应用和实例化)添加了一个实例化的功能,之前只能是类()进行,现在扩展一个功能,直接加@staticmethod,对象可以调用。
如果不使用@staticmethod,实例调用时就会产生绑定方法,必须传入self;
但凡是定义在类的内部,并且没有被任何装饰器修饰过的方法,都是绑定方法:有自动传值功能。
3.类方法
@classmethod
类方法是给类使用的,类在使用时会将类本身当做参数传给类方法的第一个参数,,python为我们内置了函数classmethod来把类中的函数定义成类方法
class Foo: def bar(self): pass @classmethod def test(cls):#把一个方法绑定到类:类.绑定到类的方法() #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念) print(cls) print(Foo.bar) print(Foo.test) <function Foo.bar at 0x032D4078> <bound method Foo.test of <class '__main__.Foo'>>
实现类本身当做第一个参数自动传给绑定到类的方法
class Foo: def bar(self): pass @classmethod def test(cls):#把一个方法绑定到类:类.绑定到类的方法() #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念) print(cls) # print(Foo.bar) # print(Foo.test) Foo.test() <class '__main__.Foo'>
class Foo: def bar(self): pass @classmethod def test(cls,k):#把一个方法绑定到类:类.绑定到类的方法() #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念) print(cls,k)#拿到一个类的内存地址,就可以实例化或者引用类的属性了 # print(Foo.bar) # print(Foo.test) Foo.test(1) <class '__main__.Foo'> 1
__str__的用法
必须返回字符串
更正以后:
打印对象会触发类的str方法。
str小结:
定义在类内部,必须返回一个字符串类型;
什么时候会触发它的执行呢?
打印由这个类产生的对象时,会触发执行
Str和classmethod应用场景
import time class Date: def __init__(self,year,month,day): self.year=year self.month=month self.day=day @classmethod#绑定到子类 def now(cls):#用Date.now()的形式去产生实例,该实例是当前的时间 t=time.localtime()#获取结构式的时间格式 return cls(t.tm_year,t.tm_mon,t.tm_mday)#新建实例并返回 @classmethod#绑定到子类 def tomorrow(cls):#用Date.now()的形式去产生实例,该实例是明天的时间 t=time.localtime(time.time()+86400) return cls(t.tm_year,t.tm_mon,t.tm_mday) class EuroDate(Date): def __str__(self):# 打印由这个类产生的对时,会触发执行 return "年:%d,月:%d,日:%d"%(self.year,self.month,self.day) e1=EuroDate.now() print(e1)
python之封装与扩展性的更多相关文章
- python基础----封装、封装与扩展性
从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...
- 面向对象 - 1.封装之如何实现属性的隐藏/2.封装的意义/3.封装与扩展性/4.property的使用
1.封装之如何实现属性的隐藏封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Attr ...
- 面向对象编程(封装、封装的意义、封装与扩展性、@property)
1.封装之如何实现属性的隐藏 封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Att ...
- python面向对象-封装-property-接口-抽象-鸭子类型-03
封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...
- 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- Java并发编程:性能、扩展性和响应
1.介绍 本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实 ...
- Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...
- 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01
在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...
- Atitit.兼具兼容性和扩展性的配置方案attilax总结
Atitit.兼具兼容性和扩展性的配置方案attilax总结 文件配置法1 Jdbc多数据源文件配置发1 Bat文件配置法1 改进的文件配置法(采用类似i18n技术) 推荐1 使用自动化pc_id的方 ...
随机推荐
- [转]Howto: 使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能
原文地址:http://support.esrichina-bj.cn/2009/0728/1007.html 文章编号 : 37033 软件: ArcGIS API for Microsoft Si ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-6项目缓冲方案
Asp.Net Core2.0下使用memcached缓存. Memcached目前微软暂未支持,暂只支持Redis,由于项目历史原因,先用博客园开源项目EnyimMemcachedCore,后续用到 ...
- cactiEZ 配置
CactiEZ 中文版是简单有效的cacti中文解决方案,它基于centos6 整合了cacti的相关软件,重新编译的一个新的操作系统 它基于centos6,启动速度快,支持EXT4文件系统,全中文页 ...
- oracle数据入库出现空格问题
java做数据入库,不知为什么报如下图错误: debug发现数据是两位,如(FB),但是入库后发现FB后面多了两个空格,检查表发现类型声明是char(4),上网百度,说是char类型会自动补足.参考h ...
- day 69 orm操作之表关系,多对多,多对一(wusir总结官网的API)
对象 关系 模型 wusir博客地址orm官网API总结 django官网orm-API orm概要: ORM 跨表查询 class Book(models.Model): title = mod ...
- Codeforces 1105D Kilani and the Game【BFS】
<题目链接> 题目大意: 每个玩家控制一个颜色去扩张,每个颜色的扩张有自己的速度,一个颜色跑完再跑下一种颜色.在所有颜色不能在继续扩张的时候停止游戏.询问此时各种颜色的数量. 解题分析: ...
- Pandas学习1 --- 数据载入
import numpy as np import pandas as pd 数据加载 首先,我们需要将收集的数据加载到内存中,才能进行进一步的操作.pandas提供了非常多的读取数据的函数,分别应用 ...
- HDU 5113
HDU 5113类似四色定理的什么东西,大体就是dfs了,不过有两个坑点,这个题的逼格瞬间就上去了1.剪枝很神奇,任何一种颜色都不能超过剩下总格子数的一半,想想确实显然但是比赛的时候没有想到:2.测评 ...
- javaScript函数节流与函数防抖
javaScript函数节流与防抖之区别 函数防抖(debounce)与函数节流(throttle)都是为了限制函数的执行频次,以优化函数触发频率过高导致的响应速度跟不上触发频率,出现延迟.假死或卡顿 ...
- python实现链表(二)
class SingleNode(object): """单链表的结点""" def __init__(self,item): # _ite ...