python学习笔记(二十四)继承与封装
继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承。
实现继承的类称为子类,也叫派生类,而被继承的类称为父类,也叫超类或基类。
类的属性和方法可以被继承
注意:私有属性和方法不能被继承,构造方法也不能被继承
继承的好处:
1)提高代码的重用性和扩展性
2)模拟现实世界的关系
3)结构更清晰
继承的弊端:
1)让类的耦合性增强(某个类的改变就会影响其他和该类相关的类)
2)打破了封装性
写代码的原则:低耦合、高内聚。
耦合:类和类的关系
内聚:自己完成某件事的能力
下面看看继承的实例吧,代码如下:
- class Dady(object):
- def __init__(self):
- self.money =
- self.house = '3环里20套'
- def sing(self):
- print('唱歌')
- def dance(self):
- print('跳广场舞')
- def lm(self):
- print('找朋友')
- class Son(Zll): #继承只需在子类括号中写上父类类名就可以继承了
- def dance(self): #重写dance(self)这个方法
- print('跳霹雳舞')
- if __name__ == '__main__': #调试代码使用
- aa = Son() #实例化一个son,这样他会继承Dady类里的属性和方法
- print(aa.house) #继承父类属性
- print(aa.money) #继承父类属性
- aa.lm() #继承父类的lm()方法
- aa.dance() #重写了的dance是调用son类自己的
如果我们在项目中需要使用到mysql和redis,那么这两个的连接信息我们可以写在基类中,然后redis类和mysql类分别继承基类,这样就提高了代码的重用性。
- class Base(object):
- def __init__(self,host,port,password):
- self.host = host,
- self.port = port
- self.password = password
- class Mysql(Base):
- pass
- class Redis(Base):
- pass
封装数据的主要原因是:保护隐私(把不想别人知道的东西封装起来)
封装方法的主要原因是:隔离复杂度(比如:电视机,我们看见的就是一个黑匣子,其实里面有很多电器元件,对于 用户来说,我们不需要清楚里面都有些元件,电视机把那些电器元件封装在黑匣子里,提供给用户的只是几个按钮接口, 通过按钮就能实现对电视机的操作。)
例如,我们可以将redis操作的一些方法封装起来,以后需要用到的时候直接调用就可以了。比如:string类型的和hash类型的各种操作。代码如下:
- import redis
- # r = redis.Redis()
- class MyRedis():
- def __init__(self,ip,password,port=,db=):
- #构造函数
- try:
- self.r = redis.Redis(host=ip,password=password,port=port,db=db) #这时候并不会去连redis,所以捕捉不到数据库连接的异常,也可以不写try
- # r = redis.ConnectionPool(host=ip,password=password,port=port,db=db)
- except Exception as e:
- print('redis连接失败,错误信息%s'%e)
- def str_get(self,k):
- res = self.r.get(k)
- if res:
- return res.decode()
- def str_set(self,k,v,time=None):
- self.r.set(k,v,time)
- def delete(self,k):
- tag = self.r.exists(k) #判断这个key是否存在
- if tag:
- self.r.delete(k)
- print('删除成功')
- else:
- print('这个key不存在')
- def hash_get(self,name,k):
- res = self.r.hget(name,k)
- if res:
- return res.decode()
- def hash_set(self,name,k,v):
- self.r.hset(name,k,v)
- def hash_getall(self,name):
- data = {}
- # {b'': b'', b'': b'sdad', b'': b'asdadsa'}
- res = self.r.hgetall(name)
- if res:
- for k,v in res.items():
- k = k.decode()
- v = v.decode()
- data[k]=v
- return data
- def hash_del(self,name,k):
- res = self.r.hdel(name,k)
- if res:
- print('删除成功')
- return
- else:
- print('删除失败,该key不存在')
- return
- @property #(属性方法)装饰器,类似于属性的方法,调用时不用加括号
- def clean_redis(self):
- self.r.flushdb() #清1空redis
- print('清空redis成功!')
- return
- my = MyRedis('127.0.0.1','')
- my.str_get('sss')
python学习笔记(二十四)继承与封装的更多相关文章
- Python学习日记(二十四) 继承
继承 什么是继承?就是一个派生类(derived class)继承基类(base class)的字段和方法.一个类可以被多个类继承;在python中,一个类可以继承多个类. 父类可以称为基类和超类,而 ...
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法window安装redis,下载Redis的压缩包https://git ...
- Python学习笔记(十四)
Python学习笔记(十四): Json and Pickle模块 shelve模块 1. Json and Pickle模块 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不 ...
- (C/C++学习笔记) 二十四. 知识补充
二十四. 知识补充 ● 子类调用父类构造函数 ※ 为什么子类要调用父类的构造函数? 因为子类继承父类,会继承到父类中的数据,所以子类在进行对象初始化时,先调用父类的构造函数,这就是子类的实例化过程. ...
- Python学习笔记(十四):模块高级
以Mark Lutz著的<Python学习手册>为教程,每天花1个小时左右时间学习,争取两周完成. --- 写在前面的话 2013-7-23 21:30 学习笔记 1,包导入是把计算机上的 ...
- Python 学习笔记(十四)Python类(二)
创建简单的类 新式类和经典类(旧式类) Python 2.x中默认都是经典类,只有显式继承了object才是新式类 Python 3.x中默认都是新式类,经典类被移除,不必显式的继承object 新式 ...
- python学习笔记-(十四)进程&协程
一. 进程 1. 多进程multiprocessing multiprocessing包是Python中的多进程管理包,是一个跨平台版本的多进程模块.与threading.Thread类似,它可以利用 ...
- Python学习(二十四)—— 前端基础之Bookstrap
转载自:http://www.cnblogs.com/liwenzhou/p/8214637.html 一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.Jav ...
- Java学习笔记二十四:Java中的Object类
Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...
- python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步
1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...
随机推荐
- Entity Framework(三):使用特性(数据注解)创建表结构
一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...
- 打印-print.js
//打印开始// strPrintName 打印任务名// printDatagrid 要打印的datagridfunction CreateFormPage(ctx,strPrintName, pr ...
- 重新=》easyui DataGrid是否可以动态的改变列显示的顺序
$.extend($.fn.datagrid.methods,{ columnMoving: function(jq){ return jq.each(function(){ var target = ...
- [JS] 页面回车键提交表单-常用于登录页面
//判断是否按下了回车键 var EnterSubmit = function(evt){ evt= window.event || evt; if (evt.keyCode == 13){ //若按 ...
- GitHub 上 57 款最流行的开源深度学习项目【转】
GitHub 上 57 款最流行的开源深度学习项目[转] 2017-02-19 20:09 334人阅读 评论(0) 收藏 举报 分类: deeplearning(28) from: https:// ...
- 硬件设计之串口收发器---ISO1050 (现行) 隔离式 5V CAN 收发器
http://www.ti.com.cn/product/cn/iso1050 http://www.deyisupport.com/question_answer/dsp_arm/sitara_ar ...
- mysql -- 一次执行多条sql语句
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
- Linux服务器的最大内存和CPU数
从网上查了很多资料.总算把linux下的内存和cpu个数搞清楚了.个人觉得使用linux系统的朋友都应该了解下.先公布如下,如有错误,请反馈给我.谢谢!! Linux系统/服务器能够支持的最大内存和C ...
- iOS开发之--苹果个人开发者账号如何升级成公司账号
1.拨打苹果针对中国区开发者的咨询服务热线:4006 701 855 2.简单向对方(中文不太标准,但听懂没问题)说明意图后,会要求提供: (1)之前申请IDP时purchase form上的pers ...
- 用vue2.0实现点击选中active,其他选项互斥的效果
在正常的js中.我们如果要实现点击选中active然后其他取消的效果,我们可以定义一个类,当点击的时候给给多有的dom取消active的类,给当前元素加上这个类名,说的很啰嗦,直接来看代码说话吧(表示 ...