(继承补充)组合
 obj=fun()#对象
 obj.attr=foo()#对象的属性等于另一个对象
 什么是组合: 
    A类的对象具备某一个属性,该属性的值是B类的对象
    基于这种方式就把A类与B类组合到一起
    对象既能使用A类中的数据与功能,也能使用B类中的数据与功能
 为什么要用组合:
     组合与继承的作用一样,都是用来减少类与类之间的重复代码
 #组合不属于继承
 #类使用将变量及处理其的函数捆绑起来
 #继承是强耦合,组合是解耦合
 如何用组合:
  class People:
     def __init__(self,name,age):
        self.name=name
        self.age=age
        self.eat=[]
     def tell_eat(self):
        for i in self.eat:
           i.tell_info()
     
  class Eat:
     def __init__(self,e_name,e_price):
        self.e_name=e_name
        self.e_price=e_price
     def tell_info(self):
        print('食物%s 价格%s'%(self.e_name,self.e_price))
  p=People('张三',18)
  eat1=Eat('肯德鸡',38)
  eat2=Eat('烤乳猪',120)
  p.eat.append(eat)
  
 多态与多态性
        什么是多态:
        同一种事物有多种形态在程序中用继承可以表现出多态
        多态性:
        在多态的背景下,可以在不用考虑对象具体类型的前提下而直接使用对象
        多态性的精髓:统一
  import abc
  class Animal(metaclass=abc.ABCMeta):#强制子类使用这套标准中加@..的名字,子类没有报错
     @abc.abstractmethod   #被强制的名字
     def speak(self):
        pass
    
     def run(self):
        pass
  # Animal() # 父类只是用来建立规范的,不能用来实例化的,更无需实现内部的方法
  class People(Animal):
     def speak(self):
        print('say hello')
  class Dog(Animal):
     def speak(self):
        print('汪汪汪')
     def run(self):
        pass
           
        python推崇鸭子类型:(像什么,就有什么的特征)
            class Txt:
                def read(self):
                    pass
            class Disk:
                def read(self):
                    pass
     
#BMI=体重(kg)÷身高^2(m)
#首先需要明确。bmi是算出来的,不是一个固定死的值,很明显人的bmi值听起来更像一个名词而非动词,于是我们需要为bmi这个函数添加装饰器将其伪装成一个数据属性
# @property装饰器是用来将类内的函数属性伪装成数据属性
#@property装饰的函数可以调setter及deleter
# class People:
#     def __init__(self,name):
#         self.__name=name
#
#     @property
#     def name(self):
#         return '<名字:%s>' %self.__name
#
#     @name.setter
#     def name(self,obj):
#         if type(obj) is not str:
#             print('name必须为str类型')
#             return
#         self.__name=obj
#
#     @name.deleter
#     def name(self):
#         # print('不让删')
#         del self.__name
#
# obj=People('egon')
#
# # print(obj.name)
# # obj.name='EGON'
# # obj.name=123
# # print(obj.name)
#
# del obj.name
# print(obj.__dict__)
封装
 self.__name=name #_类名__name 定义阶段转形
 什么是封装?
     装:往容器/名称空间里存入名字
     封:代表将存放于名称空间中的名字给藏起来,这种隐藏对外不对内
  补充说明:封装绝对不是单纯意义的隐藏
    需知定义属性的目的就是为了让使用者去用,使用者要想使用类内部隐藏的属性
    需要类的设计者在类内部开一个接口(定义一个方法),在该方法内访问隐藏的属性
    ,使用者以后就通过该方法来“间接地”访问内部隐藏的属性
    作为类的设计者可以在接口之上附加任意逻辑从而严格控制类的使用者对属性的操作
 如何封装?
        1. __开头的属性实现的隐藏仅仅只是一种语法意义上的变形,并不会真的限制类外部的访问
        2. 该变形操作只在类定义阶段检测语法时发生一次,类定义阶段之后新增的__开头的属性并不会变形
        3. 如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
 封装形式?
  封装数据属性:把数据属性封装起来,然后需要开辟接口给类外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格空间访问者对属性的操作
  class People:
                def __init__(self,name):
                    self.__name=name
                def tell_name(self):
                    # 添加逻辑
                    return self.__name
     
  封装函数属性:隔离复杂度
            class ATM:
                def __card(self):
                    print('插卡')
                def __auth(self):
                    print('用户认证')
                def __input(self):
                    print('输入取款金额')
                def __print_bill(self):
                    print('打印账单')
                def __take_money(self):
                    print('取款')
                def withdraw(self):
                    self.__card()
                    self.__auth()
                    self.__input()
                    self.__print_bill()
                    self.__take_money()
  封装的终极奥义:明确地区分内外,对外是隐藏的,对内是开放的

面向对象特征:封装、多态 以及 @propetry装饰器的更多相关文章

  1. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  2. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  3. Python学习日记(二十六) 封装和几个装饰器函数

    封装 广义上的封装,它其实是一种面向对象的思想,它能够保护代码;狭义上的封装是面向对象三大特性之一,能把属性和方法都藏起来不让人看见 私有属性 私有属性表示方式即在一个属性名前加上两个双下划线 cla ...

  4. Learn day7 继承(单、多、菱形)\多态\魔术方法\装饰器\异常

    1.继承 1.1 单继承# ### 继承 """ (1) 单继承 (2) 多继承 至少2个类,子类和父类 一个类继承另外一个类,当前类是子类 (衍生类) 被继承的这个类是 ...

  5. (8)propetry装饰器

    propetry是一个内置函数,用来将一个功能伪装成一个数据属性 property将一个方法伪装成一个数据属性class People: def __init__(self,name,height,w ...

  6. 03_Java面向对象特征: 封装性

    1. 面向对象的概念 面向对象是相对面向过程而言,面向对象和面向过程都是一种思想 面向过程• 强调的是功能行为面向对象• 将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象 ...

  7. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  8. Java SE 第十六讲----面向对象特征之多态

    1.多态:polymorphism:我们说的子类就是父类(玫瑰是花,男子是人),因此多态的意思就是:父类型的引用可以指向子类的对象 public class PolyTest { public sta ...

  9. python面向对象:组合、封装、property装饰器、多态

    一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...

随机推荐

  1. 牛客练习赛40 C 小A与欧拉路(树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...

  2. Missing artifact com.github.pagehelper:pagehelper:jar:3.4.2-fix的解决方法(最简单的方法)

    在网上看的淘淘商城的项目,自己在配置maven项目的时候遇见了这个异常,按照网上教程试了试,一重启各种异常. 后来直接,就更改了自己的maven仓库就ok了. 解决方法: 对比一下,你就能够发现问题, ...

  3. UML类关系(依赖,关联,聚合,组合,泛化,实现)

    转自https://blog.csdn.net/k346k346/article/details/59582926   在学习面向对象设计时,类关系涉及依赖.关联.聚合.组合和泛化这五种关系,耦合度依 ...

  4. AIC和BIC

    一.模型选择之AIC和BIC 人们提出许多信息准则,通过加入模型复杂度的惩罚项来避免过拟合问题,此处我们介绍一下常用的两个模型选择方法 赤池信息准则(Akaike Information Criter ...

  5. Telnet的三种登录方式

    Telnet的三种登录方式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.华为创建telnet的三种验证方式 首先,我们可以简单的看一个拓扑图,让我们可以在亦庄的路由器上对双桥 ...

  6. 函数和常用模块【day06】:xml模块(六)

    本节内容 1.简述 2.xml格式 3.xml节点操作 4.创建新的xml文件 一.简述 xml是实现不同语言或者程序之间进行数据交换的协议,跟json差不多,但是json使用起来更简单,不过,古时候 ...

  7. Kafka 0.10问题点滴

    15.如何消费内部topic: __consumer_offsets 主要是要让它来格式化:GroupMetadataManager.OffsetsMessageFormatter 最后用看了它的源码 ...

  8. IDEA中阿里JAVA代码规范插件(P3C)的安装及使用

    JAVA代码规范插件(P3C)是阿里巴巴2017年10月14日在杭州云栖大会上首发的,使之前的阿里巴巴JAVA开发手册正式以插件形式公开走向业界.插件的相关信息及安装包都可以在GitHub(https ...

  9. Calendar add 方法 和set方法

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar c = Calendar. ...

  10. Redis模块学习笔记(一)RediSearch简单使用

    说明:安装的Redis服务器必须为 4.0 以上版本,通过info命令查看 > INFO redis_version: 一.安装 RediSearch git clone https://git ...