day25
今日内容
1、组合
2、多态与多态性
3、封装
4、property
组合:
什么是组合?
是指某一对象拥有的一个属性,该属性的值是另一个类的对象
为何用组合?
就是通过为某个对象添加一个新的属性(另一个类的对象)的方式,间接的将两个类关联/整合/组合在一起
从而减少类与类之间的代码冗余
如何用组合?
####################################################
class foo:
x = 500
def go(self):
print('foo.run') class person:
def __init__(self,name,age):
self.name = name
self.age = age people1 = person('ybg',74)
people1.att = foo #就是将foo这个类所有属性和方法都赋值给了 people.att这个属性
print(people1.att.x)
people1.att.go(1)
print(people1.name)
####################################################
多态与多态性
什么是多态?
就是一种/类事物的多种形态
为何用多态?
在多态的背景下,可以不用考虑事物的具体类型直接使用对象
多态的精髓:统一
#########################################################
import abc class animal(metaclass=abc.ABCMeta):
@abc.abstractmethod
def speck(self):
pass @abc.abstractmethod
def run(self):
pass
# animal父类 是用来建立规范的,不能用来实例化,更不需要实现内部方法 class pig(animal):
def speck(self):
print('哼哼哼') def run(self):
pass class ybg(animal):
def speck(self):
print('汪汪汪') def run(self):
pass class person(animal):
def speck(self):
print('hello world') def run(self):
pass obj1 = pig()
obj2 = ybg()
obj3 = person() obj1.speck()
obj2.speck()
obj3.speck()
##########################################################
封装
什么是封装?
封:将名称空间里的名字隐藏起来,该隐藏对外不对内
装:往一个容器(名称空间)里存放名字
为何用封装?
封装数据属性:将一个类内部的属性隐藏起来,从而使得外部无法直接操作属性,通过在类内部设置一
个接口,外部只有通过这个接口才能间接的操作类内部的属性,可以在接口内定义任意的控制逻辑,从而严格控
制对属性的操作。
封装函数属性:隔离复杂度
如何用封装?
在类内,在需要封装的属性或者方法(变量名,函数名)前加__(结尾没有)
总结:
1、__开头的属性或者方法只是在语法意义上进行了一种变形,并不会真的对外部的访问做限制。
2、该变形只会在定义类检测语法时发生一次,后面增加的__开头的属性不会被变形
3、如果父类的属性不想被子类覆盖,可以在属性开头加__
#######################################################################
class foo:
__x = 100
__y = 100
def __init__(self,name,age):
self.__name = name
self.__age = age def __run(self):
print('let`s go') def show(self):
print(self.__name,self.__age) class sub1(foo):
pass
# 1. __开头的属性到底如何实现的隐藏?
# 2. 如何实现的对外隐藏,对内不隐藏?
obj1 = foo('ybg',74)
print(obj1.__dict__)#解释如何实现的隐藏:就是在检测语法时就改变了foo类中的开头加__的属性名称
foo.__xxx = 1111
print(obj1.__xxx)#解释如何实现对外不对内的隐藏机制:因为对于属性名字的变形只会发生在类定义时检测语法的时候(在这个时候只发生一次)
#######################################################################
#######################################################################
# 实现让被封装了的属性能够在类外部也能被修改的操作(通过在类内部添加一个接口可以让外部使用接口来对内部的值进行修改)
class foo:
__x = 100
__y = 100
def __init__(self,name,age):
self.__name = name
self.__age = age def __run(self):
print('let`s go') def show(self):
print(self.__name,self.__age)
self.__run() def set(self,name,age):
if type(name) is not str:
print('name只能为字符串类型')
return
if type(age) is not int:
print('age只能是整型')
return
self.__name =name
self.__age = age obj1 = foo('ybg',74)
obj1.show()
obj1.set('YBG','SB')
obj1.set(74,99)
obj1.set('YBG',99)
obj1.show()
#######################################################################
property可以将类内函数数据隐藏成数据属性
############################################################
class person:
def __init__(self,name,height,weight):
self.name = name
self.height = height
self.weight = weight
@property
def bmi(self):
return self.weight / (self.height**2) obj1 = person('ybg',1.5,40)
print(obj1.bmi)#此处的bmi就不需要加括号了,因为在类内的bmi函数体代码上有了@property
###############################################################################
了解知识(property用法)
###########################################################################
class person:
def __init__(self,name):
self.__name = name @property
def name(self):
print(self.__name) @name.setter
def name(self,name):
self.__name = name @name.deleter
def name(self):
del self.__name
print('删除成功') obj1 = person('ybg')
obj1.name
obj1.name='YBG'
obj1.name
del obj1.name
print(obj1.__dict__)
###########################################################################
day25的更多相关文章
- day25<多线程+&设计模式&GUI>
多线程(单例设计模式)(掌握) 多线程(Runtime类) 多线程(Timer)(掌握) 多线程(两个线程间的通信)(掌握) 多线程(三个或三个以上间的线程通信) 多线程(线程间的通信注意的问题) 多 ...
- java多线程设计模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...
- [温故]图解java多线程设计模式(一)
去年看完的<图解java多线程设计模式>,可惜当时没做笔记,导致后来忘了许多东西,打算再温习下这本书,顺便在这里记录一下~ 1.顺序执行.并行.并发 顺序执行:多个操作按照顺序依次执行. ...
- Java多线程设计模式(4)线程池模式
前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式 ...
- 多线程设计模式 - Future模式
Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...
- 14.多线程设计模式 - Master-Worker模式
多线程设计模式 - Master-Worker模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更 ...
- 13.多线程设计模式 - Future模式
多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...
- 多线程设计模式——Read-Write Lock模式和Future模式分析
目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...
- JavaEE基础(二十五)/多线程、GUI
1.多线程(单例设计模式) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类中定义一个本类的 ...
- 【Java基础】【25多线程(下)&GUI】
25.01_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类 ...
随机推荐
- 老男孩教育python全栈第九期视频
失效了在下面评论即可,会及时更新.python9期已全部更新完 链接: https://pan.baidu.com/s/1VV8_ZyVasK05iKd7QMxO-A 密码: 9zau
- Linux服务器开启ssh服务,实现ssh远程登陆!
最近在学linux,使用ssh远程登陆linux,记录下来! 首先进入/etc目录下,/etc目录存放的是一些配置文件,比如passwd等配置文件,要想使用ssh远程登陆,需要配置/etc/ssh/s ...
- 记录常用的git命令
之前的公司都是用svn的,现在的公司用git了,所以现在记录一下所用到的git命令,方便以后查看! git 常用命令 git add git add 命令可将该文件添加到缓存 git add . // ...
- ss 重新设置 端口的方法 记录
1. 选择 ssh 进行远程登入: ssh root@服务器ip -p 端口, 事例如:ssh root@176.122.134.96 -p 28202 2. ls 展示 当前目录下的文件,看到有 s ...
- 前端hash路由基本原理,及代码的基本实现
路由就是指随着浏览器地址栏的变化,展示给用户的页面也不相同. 早期的路由都是后端实现的,直接根据 url 来 reload 页面,页面变得越来越复杂服务器端压力变大,随着 ajax 的出现,页面实现非 ...
- 高德地图 JS API - 根据经纬度获取周边建筑地标
像我们经常用的微信或微博,发表动态时都有选择位置的功能,根据当前的定位获取附近的地标.利用高德地图我们就可以实现这样的功能. 1. 具体代码: // 高德地图查询周边 function aMapSea ...
- 大数据时代,银行BI应用的方案探讨
大数据被誉为21世纪发展创造的新动力,BI(商业智能)成为当下最热门的数据应用方案.据资料显示:当前中国大数据IT投资最高的为五个行业中,互联网最高.其次是电信.金融.政府和医疗.而在金融行业中,银行 ...
- Flutter 修改TextField的高度,以及无边框圆角
修改TextField的高度可以通过decoration: InputDecoration的contentPadding进行修改,代码如下 new TextField( decoration: Inp ...
- Python——Queue模块以及生产消费者模型
1.了解Queue Queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递 |queue.Qu ...
- Linux服务器ftp+httpd部署
一.ftp安装 1.安装vsftpd 命令:yum -y install vsftpd 2.修改ftp配置文件 命令:vim /etc/vsftpd/vsftpd.conf 3.按i进入insert模 ...