今日内容

  1、组合

  2、多态与多态性

  3、封装

  4、property

组合:

  什么是组合?

    是指某一对象拥有的一个属性,该属性的值是另一个类的对象

  为何用组合?

    就是通过为某个对象添加一个新的属性(另一个类的对象)的方式,间接的将两个类关联/整合/组合在一起
    从而减少类与类之间的代码冗余

  如何用组合?

####################################################

  1. class foo:
    x = 500
    def go(self):
    print('foo.run')
  2.  
  3. class person:
    def __init__(self,name,age):
    self.name = name
    self.age = age
  4.  
  5. people1 = person('ybg',74)
    people1.att = foo #就是将foo这个类所有属性和方法都赋值给了 people.att这个属性
    print(people1.att.x)
    people1.att.go(1)
    print(people1.name)

####################################################

多态与多态性

  什么是多态?

    就是一种/类事物的多种形态

  为何用多态?

    在多态的背景下,可以不用考虑事物的具体类型直接使用对象

    多态的精髓:统一

#########################################################

  1. import abc
  2.  
  3. class animal(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def speck(self):
    pass
  4.  
  5. @abc.abstractmethod
    def run(self):
    pass
    # animal父类 是用来建立规范的,不能用来实例化,更不需要实现内部方法
  6.  
  7. class pig(animal):
    def speck(self):
    print('哼哼哼')
  8.  
  9. def run(self):
    pass
  10.  
  11. class ybg(animal):
    def speck(self):
    print('汪汪汪')
  12.  
  13. def run(self):
    pass
  14.  
  15. class person(animal):
    def speck(self):
    print('hello world')
  16.  
  17. def run(self):
    pass
  18.  
  19. obj1 = pig()
    obj2 = ybg()
    obj3 = person()
  20.  
  21. obj1.speck()
    obj2.speck()
    obj3.speck()

##########################################################

封装

  什么是封装?

    封:将名称空间里的名字隐藏起来,该隐藏对外不对内

    装:往一个容器(名称空间)里存放名字

  为何用封装?

    封装数据属性:将一个类内部的属性隐藏起来,从而使得外部无法直接操作属性,通过在类内部设置一

个接口,外部只有通过这个接口才能间接的操作类内部的属性,可以在接口内定义任意的控制逻辑,从而严格控

制对属性的操作。

    封装函数属性:隔离复杂度

  如何用封装?

    在类内,在需要封装的属性或者方法(变量名,函数名)前加__(结尾没有)

    总结:

      1、__开头的属性或者方法只是在语法意义上进行了一种变形,并不会真的对外部的访问做限制。

      2、该变形只会在定义类检测语法时发生一次,后面增加的__开头的属性不会被变形

      3、如果父类的属性不想被子类覆盖,可以在属性开头加__

#######################################################################

  1. class foo:
    __x = 100
    __y = 100
    def __init__(self,name,age):
    self.__name = name
    self.__age = age
  2.  
  3. def __run(self):
    print('let`s go')
  4.  
  5. def show(self):
    print(self.__name,self.__age)
  6.  
  7. class sub1(foo):
    pass
  1. # 1. __开头的属性到底如何实现的隐藏?
    # 2. 如何实现的对外隐藏,对内不隐藏?
  1. obj1 = foo('ybg',74)
    print(obj1.__dict__)#解释如何实现的隐藏:就是在检测语法时就改变了foo类中的开头加__的属性名称
  2.  
  3. foo.__xxx = 1111
    print(obj1.__xxx)#解释如何实现对外不对内的隐藏机制:因为对于属性名字的变形只会发生在类定义时检测语法的时候(在这个时候只发生一次)

#######################################################################

#######################################################################

  1. # 实现让被封装了的属性能够在类外部也能被修改的操作(通过在类内部添加一个接口可以让外部使用接口来对内部的值进行修改)
  1. class foo:
    __x = 100
    __y = 100
    def __init__(self,name,age):
    self.__name = name
    self.__age = age
  2.  
  3. def __run(self):
    print('let`s go')
  4.  
  5. def show(self):
    print(self.__name,self.__age)
    self.__run()
  6.  
  7. 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
  8.  
  9. obj1 = foo('ybg',74)
    obj1.show()
    obj1.set('YBG','SB')
    obj1.set(74,99)
    obj1.set('YBG',99)
    obj1.show()

#######################################################################

property可以将类内函数数据隐藏成数据属性

############################################################

  1. 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)
  2.  
  3. obj1 = person('ybg',1.5,40)
    print(obj1.bmi)#此处的bmi就不需要加括号了,因为在类内的bmi函数体代码上有了@property

###############################################################################

了解知识(property用法)

###########################################################################

  1. class person:
    def __init__(self,name):
    self.__name = name
  2.  
  3. @property
    def name(self):
    print(self.__name)
  4.  
  5. @name.setter
    def name(self,name):
    self.__name = name
  6.  
  7. @name.deleter
    def name(self):
    del self.__name
    print('删除成功')
  8.  
  9. obj1 = person('ybg')
    obj1.name
    obj1.name='YBG'
    obj1.name
    del obj1.name
    print(obj1.__dict__)

###########################################################################

day25的更多相关文章

  1. day25<多线程+&设计模式&GUI>

    多线程(单例设计模式)(掌握) 多线程(Runtime类) 多线程(Timer)(掌握) 多线程(两个线程间的通信)(掌握) 多线程(三个或三个以上间的线程通信) 多线程(线程间的通信注意的问题) 多 ...

  2. java多线程设计模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...

  3. [温故]图解java多线程设计模式(一)

    去年看完的<图解java多线程设计模式>,可惜当时没做笔记,导致后来忘了许多东西,打算再温习下这本书,顺便在这里记录一下~  1.顺序执行.并行.并发 顺序执行:多个操作按照顺序依次执行. ...

  4. Java多线程设计模式(4)线程池模式

    前序: Thread-Per-Message Pattern,是一种对于每个命令或请求,都分配一个线程,由这个线程执行工作.它将“委托消息的一端”和“执行消息的一端”用两个不同的线程来实现.该线程模式 ...

  5. 多线程设计模式 - Future模式

    Future模式是多线程开发中非常常见的一种设计模式,它的核心思想是异步调用.这类似我们日常生活中的在线购物流程,带在购物网看着一件商品时可以提交表单,当订单完成后就可以在家里等待商品送货上门.或者说 ...

  6. 14.多线程设计模式 - Master-Worker模式

    多线程设计模式 - Master-Worker模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更 ...

  7. 13.多线程设计模式 - Future模式

    多线程设计模式 - Future模式 并发设计模式属于设计优化的一部分,它对于一些常用的多线程结构的总结和抽象.与串行相比并行程序结构通常较为复杂,因此合理的使用并行模式在多线程并发中更具有意义. 1 ...

  8. 多线程设计模式——Read-Write Lock模式和Future模式分析

    目录 多线程程序评价标准 任何模式都有一个相同的"中心思想" Read-Write Lock 模式 RW-Lock模式特点 冲突总结 手搓RW Lock模式代码 类图 Data类 ...

  9. JavaEE基础(二十五)/多线程、GUI

    1.多线程(单例设计模式) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类中定义一个本类的 ...

  10. 【Java基础】【25多线程(下)&GUI】

    25.01_多线程(单例设计模式)(掌握) 单例设计模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢? (1)控制类的创建,不让其他类来创建本类的对象.private (2)在本类 ...

随机推荐

  1. 根据python上下文管理,写一个在读文件内容前后自动打开关闭文件的程序

    利用上下文管理实现读f文件前后自动打开关闭文件#在本目录创建f文件,内容写monkey代码如下 import contextlib #导入模块1 @contextlib.contextmanager# ...

  2. css inline元素和inline-block元素之间缝隙产生原因和解决办法

    行内元素产生水平空隙的原因及解决方案 这篇文章讲的很好,但是提供的解决方案没有这篇好实现 去除inline-block元素间间距的N种方法

  3. 安卓基础之Activity的四种启动模式

    Activity的四种启动模式   Activity的启动模式在清单文件中配置: <activity ... activity:lauchMode:"..."; //有四种模 ...

  4. LeetCode题解之Split Linked List in Parts

    1.题目描述 2.题目分析 主要是理解题意,将每个子链表应该分得的节点个数计算清楚.利用除数和余数的方法进行计算. 3.代码 vector<ListNode*> splitListToPa ...

  5. linux下搭建hexo环境

    最近对搭建个人博客比较感兴趣,但是刚搭建好next主题基本博客,电脑就坏了,借了一台电脑继续搞,不想在他电脑中弄太多环境,所以我准备在自己电脑的服务器上搭建hexo环境 服务器环境: (1)cento ...

  6. 分布式事务实现-Percolator

    Google为了解决网页索引的增量处理,以及维护数据表和索引表的一致性问题,基于BigTable实现了一个支持分布式事务的存储系统.这里重点讨论这个系统的分布式事务实现,不讨论percolator中为 ...

  7. SQL Server FileStream (转载)

    从SQL SERVER 2008开始,SQL SERVER引入了一种新的文件组类型叫FileStream文件组,如下图所示: 那么这种文件组是用来做什么的呢? 以往我们对文件管理有两种方法: 数据库只 ...

  8. js-dom-动态创建html标签时,name属性的初始化问题

    当我们动态创建可包含Name属性的元素时,不能简单的使用赋值element.name = "..."来添加其Name, 而必须在创建Element时,使用document.crea ...

  9. 解决web网站被挂马清除方法

    案例:某公司一个lamp的服务器网站站点目录下所有文件均被植入了广告脚本如下内容: <script language=javascriptsrc=http://%4%66E%78%72%67%2 ...

  10. /etc/resolv.conf服务器客户端DNS重要配置文件

    DNS客户端配置文件:etc/resolv.conf /etc/resolv.conf文件相当于windows如下图: 当然/etc/resolv.conf文件为辅助配置DNS文件,其实在网卡里也可以 ...