day22_7.26面向对象之封装(接口与抽象)
一。封装。
封装就是将丑陋复杂的隐式的细节隐藏到内部,对外提供简单的使用接口。
对外隐藏内部实现细节,并提供访问的接口。对内使用self操作。
二。为什么要封装?
对于一个计算机来说,不可能不使用机箱就将处理器,内存,硬盘等东西暴露在外面交给用户,所以对于程序来说也是一样的,目的有2:
1.为了保证关键数据的安全性。
2.对外部隐藏实现的细节,隔离复杂度。
电脑的cpu老是露在外面也不是很安全。
三。封装的使用环境
当有些数据不希望外界可以直接对其修改的时候。
当有些函数不希望给外界使用时。
这些数据通常都是程序的核心,不提倡改动的数据。
四。封装的语法
class A:
def __init__(self,name,key):
self.name=name
self.__key=key a=A('lma',666)
a.key=9
print(a.key)
print(a.__dict__)
#
#{'name': 'lma', '_A__key': 666, 'key': 9}
当在初始化一个类时,在接受参数前加上双下划线,再使用a.key访问数据时时不存在的,其实就类初始化的原理就可以发现在初始化时根本就没有key这个关键字,有的只是__key,所以不会访问,不过在访问_类名__变量名时也可以访问到该封装变量。
print(a._A__key)
#
所以封装的根本原理就是将原来的替换成了上面的关键变量。
而强行在原对象里添加该参数得到的只是一个新 的参数,使用__dict__就可以看出来。
五。权限
既然封装了,那就代表外界不能随便访问了所以需要对属性设置权限时就可以使用封装
1。公开的属性,不需要进行封装
2.私有的,只能由当前类自己使用,需要封装。
六。访问封装属性
封装是使得属性不能对外直接访问,但不应该是完全不能访问,否则封装的数据就等于没有这个数据,除了上述使用类名加属性 的方法来访问之外,还可以使用定义函数的方法对私有类进行访问和修改。
class Downer:
def __init__(self,name,url,All):
self.name=name
self.url=url
self.__All=All def get_all(self):
return self.__All def set_all(self,all):
if type(all)==int:
self.__All=all
else:
print('not int') dow=Downer('啦啦啦','www.baidu.com',512)
print(dow.get_all())
dow.set_all(213)
print(dow.get_all())
#
#
这样通过get和set可以对内部的封装属性进行操作。
七。property装饰器
使用方法对属性进行修改,虽然可行,但是对于使用这个类的人来说,必须分清哪个是普通属性,哪个是是私有属性,这使用起来 非常麻烦,而使用property装饰器就可以使得和原来普通的方法调用一致。
装饰器一共有三个,分别有不同的作用。
1.@property 可以使用在获取属性上。
2.@属性名.setter 可以使用在修改属性上
3.@属性名.deleter 可以使用在删除该属性上
用法如下:
class New:
def __init__(self,name,data):
self.name=name
self.__data=data @property
def data(self):
return self.__data @data.setter
def data(self,dat):
self.__data=dat @data.deleter
def data(self):
del self.data
经过装饰器装饰后的方法就可以将其和原来的属性一样使用,只有当property装饰了一个方法之后其他的装饰器才有用,装饰的方法最好和封装的属性名一样。
那么问题来了,装饰后的封装属性和原来的普通属性不是一样使用吗,为什么还要大费周章的封装呢?
其实在上述代码中可以看到,在使用装饰器时可以对函数进行操作,比如不写返回值就可以不返回值,或者提示该属性不能被访问,在修改时可以提示该值不能被修改,删除也是一样。
总结:装饰器封装可以将封装属性当成普通属性使用,对其装饰的函数进行限制可以获得不同的效果。
其好处有:
1.提高安全性
2.隔离复杂度
语法:将要封装的属性或方法名称前加上双下划线
访问被隐藏的属性:
提供用于访问和修改的方法
使用property装饰器可以将一个方法伪装成普通顺属性,报纸属性之间调用方法一致
封装的实现原理 ,替换变量名称
八。接口interface
接口是一组功能的集合,但是接口中仅包含功能的名字,不包含具体的实现代码。
其本质是一套协议标准,遵循这个标准的对象就能被调用。
以电脑为例,电脑不分usb是键盘接口还是鼠标接口,只要符合usb的接口设备都可以插上使用,所以为这个现象建模:
class Usb:
def start(self):
pass def close(self):
pass def work(self):
pass def pc(oop):
oop.start()
oop.work()
oop.close() class mouse(Usb):
def start(self):
print('鼠标启动') def work(self):
print('鼠标工作') def close(self):
print('鼠标关闭') class key(Usb):
def start(self):
print('键盘启动') def work(self):
print('键盘工作') def close(self):
print('键盘关闭') newmouse=mouse()
newkey=key()
pc(newmouse)
pc(newkey)
#鼠标启动
#鼠标工作
#鼠标关闭
#键盘启动
#键盘工作
#键盘关闭
usb就相当于一个接口,限制了帮助pc工作的工具。而即使没有这个接口,如果那个工具也有这些功能亦可以工作。所以对于其他语言来说(如java),interface是一个关键字,是定义接口类不得不写的东西,而对于python来数,interface只是一个概念。
九。抽象类
import abc class Aclass(metaclass=abc.ABCMeta):
@abc.abstractmethod
def run(self):
pass class B(Aclass):
pass c=B()
如上定义了一个抽象类,其使用模块abc,在类中使用装饰器对其方法进行抽象
装饰过的方法在子类继承它时,必须重写该类,否则就会实例化失败。这种限制是强制性的,因为会把程序卡在创建对象的时候。
十。鸭子类型
当一个东西,长得像鸭子,叫声像鸭子,走路像鸭子,那它就是鸭子,python程序也是一样的,python不喜欢太多限制程序的规定,所以在编写时都是基于大家一起遵守的规定。
day22_7.26面向对象之封装(接口与抽象)的更多相关文章
- day 26面向对象 的封装 接口 抽象
大纲分析 # 面向对象# 类 :一类具有相同属性和方法的事物 #类的定义:class #类中可以定义的方法种类: #普通方法 self 对象 #类方法 cls @classmethod 类/对象 #静 ...
- 7.26 面向对象_封装_property_接口
封装 封装 就是隐藏内部实现细节, 将复杂的,丑陋的,隐私的细节隐藏到内部,对外提供简单的访问接口 为什么要封装 1.保证关键数据的安全性 2.对外部隐藏实现细节,隔离复杂度 什么时候应该封装 1.当 ...
- java四大特性理解(封装继承多态抽象)
封装: 封装是把过程和数据包围起来,对数据的访问只能通过已定义的接口.面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治.封装的对象,这些对象通过一个受保护的接口访问其他对象.封装是一 ...
- AJPFX关于面向对象之封装,继承,多态 (下)
(3)private: 对于对于成员来说:只能在该成员隶属于的类中访问. 对于类来说:类不可以声明为private. 4)protected: 对于对于成员来说:相同包中的类可以访问(包访问权限):基 ...
- servlet规范--Servlet 规范其实就是对 HTTP 协议做面向对象的封装
Servlet规范 一个最基本的 Java Web 项目所需的 jar 包只需要一个 servlet-api.jar ,这个 jar 包中的类大部分都是接口,还有一些工具类,共有 2 个包,分别是 j ...
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- Python面向对象04 /封装、多态、鸭子类型、类的约束、super
Python面向对象04 /封装.多态.鸭子类型.类的约束.super 目录 Python面向对象04 /封装.多态.鸭子类型.类的约束.super 1. 封装 2. 多态 3. 鸭子类型 4. 类的 ...
- Python面向对象:封装和多态
一.封装 封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读取和修改的访问级别. 封装就是将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进 ...
- Java面向对象(封装性概论)
Java面向对象(封装性概论) 知识概要: (1)面向对象概念 (2)类与对象的关系 (3)封装 (4)构造函数 (5)this关键字 (6)static关键 ...
随机推荐
- angular 运行报错
angular 运行时报错ERROR in node_modules/rxjs/internal/types.d.ts(81,44): error TS1005: ';' expected. node ...
- Python else
Python else else 可以用来搭配其他语句完成条件判断 最常用的就是 if...else... 当然还有一些其他语句也可以配合 else 使用 if if...else... 是最简单的条 ...
- 使用Sourcetree(for windows)建立github同步仓库
回顾Linux作业中用命令行的方式管理本地与远程仓库的过程,原理图如下: 与之前本质相同,但是使用GUI的github管理工具将更为便捷,Sourcetree就是其中之一 1.在Windows下安装g ...
- Educational Codeforces Round 78 (Rated for Div. 2) 题解
Shuffle Hashing A and B Berry Jam Segment Tree Tests for problem D Cards Shuffle Hashing \[ Time Lim ...
- C++ 实现 查找进程, 杀死进程, 启动进程, 进程重启
头文件: #include <Windows.h>#include <tlhelp32.h>#include <tchar.h>#include <Shell ...
- 详解Redis基本命令
当redis环境搭建结束后,接下来需要掌握并了解redis的一些相关命令,本篇文章主要从实际操作的层面来与大家分享redis基本命令, 具体包括:Redis五大基本类型命令(Strings,Lists ...
- STM32移植ROS--发布超声波信息
前言:之前ROS跟单片机的底层通讯主要是通过串口自定的协议来做,比如官网提供的arduino串口驱动一样,需要ROS往下发一个指令,单片机再回传一个指令,要写一大堆的协议,这样很麻烦,效率也比较低, ...
- java架构之路(mysql底层原理)Mysql之Explain使用详解
上篇博客,我们详细的说明了mysql的索引存储结构,也就是我们的B+tree的变种,是一个带有双向链表的B+tree.那么我今天来详细研究一下,怎么使用索引和怎么查看索引的使用情况. 我们先来简单的建 ...
- webform的原生操作图片预览和上传
1.使用input标签进行图片操作,input的标签有一个accept属性,accept 属性只能与 <input type="file"> 配合使用.它规定能够通过文 ...
- 你不知道的Go unsafe.Pointer uintptr原理和玩法
unsafe.Pointer 这个类型比较重要,它是实现定位和读写的内存的基础,Go runtime大量使用它.官方文档对该类型有四个重要描述: (1)任何类型的指针都可以被转化为Pointer (2 ...