zoukankan      html  css  js  c++  java
  • python之面向对象

    定义使用类

    类与实例之间的关系

    定义类就是建立模型(模子或印章)
    实例化类就是建立真实事物(产品、印章触屏的图案)
    

    有特征和有能力的类

    特征或属性 是以变量形式体现 是类自身包含或知道的数据,
    能力,以方法体现,是类具有能动性的体现
    

    实例化步骤

    调用__new__方法创建实例
    __new__()方法自动从object继承
    调用__init__()方法最气初始化
    __init__()方法在类中定义
    

    添加类说明(decstring)

    紧跟在类名行之后,以三引号包围的字符串
    查看类说明
        类名.__doc__
        help(类名)
    

    新式类与经典类

    python2.x版本
        默认为经典类
        继承object为新式类
    python3.x版本
        统一为新式类
        不用继承object
    区别 
        经典类继承为深度优先
        新式类继承为广度优先
    

    面向对象:

    1. 面向对象可以指自然界中的任何事物
    2. 计算机为解决某个领域问题所使用的事物
    3. 事物(对象)具有自身的特征或能力
    4. 计算机中的对象具有解决问题所需要的特征或能力

    面向对象的优越性

    1. 封装 将模型的特征和能力打包在一起 模型的改变有模型自身来完成,就像自然界的事物一样 隐藏模型的字节,外界只能使用他,而不必/不能改变他
    2. 继承 符合自然界的分类规律 快速的代码复用
    3. 多态 子类可以继承弗雷德特征和能力,还可以用过自定义来修改特征与能力 鸭子类型(duck typing)
      - 名字来源有 James Whitcomb Riley提出的鸭子测试。 - 当看到一只鸟走起来很象鸭子,游泳起来很象鸭子,叫起来很象鸭子,那么这只鸟可以被称为鸭子 - 在鸭子类型中,关注的不是对象的类型,而是他是如何使用的。在有的语言中必须使用接口来实现
    4. 组合 一个模型可以由其他的模型组成

    描述对象的特征

    实例属性

    类被实例化以后才会具有的属性
    一般在__init__()方法定义中创建并初始化
    直接使用即定义:self<属性名>
    引用方法:self.<属性名>
    self用来代表类的实例的
    类外用实例名.属性名方式定义和引用
    相同类的不同实例其实例属性是不相关的
    一般不建议的__init__()方法之外中创建和初始化实例属性
    一般不推荐类外定义和修改,修改可以单独定义方法
    

    类属性

    类定义后就存在,而且不需要实例化
    类属性使得相同类的不同实例共同持有相同变量
    

    私有属性

    不提供限制属性访问的关键字(无法限制类的各种属性在类外直接访问)
    使用__开头的变量名加以标志,只有类对象自己能访问
    使用_开头的变量名加以标志,应该只有类对象及其子类能访问(非强制性)
    

    特殊属性

    保存对象的元数据
    __doc__  返回类的注释
    __name__ 返回类的名字
    __dict__  返回类
    __module_—— 模块名
    __base___
    

     
    class Box:
        """盒子类"""
        counter = 0
        #----------------------------------------------------------------------
        def __init__(self):
            """Constructor"""
            Box.counter += 1
            self.length = 0
            self.width = 0 
            self.higth = 0
            self.__volume = 0
    
    
        def set_property(self,length,width,higth):
            self.length = length
            self.width = width
            self.higth = higth
    
    
        def get_volume(self):
            print('volume is %s' % (self.length * self.higth * self.width))
    
    
    
    a = Box()
    a.set_property(10, 20, 15)
    a.get_volume()
    
    b = Box()
    b.set_property(10, 8, 15)
    b.get_volume()
    
    c = Box()
    c.set_property(8, 20, 15)
    c.get_volume()
    
    d = Box()
    d.set_property(10, 10, 15)
    d.get_volume()
    
    print('实例化次数 %s 次' % d.counter)
    

    类的方法定义

    def fun_name(self,....):
        pass
    其中参数self代表类的实例
    在调用方法是有系统自动提供
    方法定义时必须指明self参数
    

    类的方法的调用

    与普通的函数调用类似
    在类的内部调用:self.<方法名> (参数列表)
    在类的外部调用:<实例名>.<方法名>(参数列表)
    注:以上两种调用方法中,提供的参数列表中都不包括self
    

    类内方法相互调用

    在一个类的内部方法之间是可以相互调用的
    调用方法同上面所述的在类的内部调用方法
    

    构造方法及其作用

    构造方法就是前面课程提到和使用的__init__()方法
    构造方法的作用就是在类实例化时初始化实例
    __init__()方法就是类实例化的第二部自动调用的函数
    注意其方法名是固定的,但其参数同普通方法一样,至少带有self参数
    初始化实例包括:定义和初始化实例属性:或调用类的一些方法
    构造方法可以带有self外的其他各种参数(关键字参数、
    默认参数、用元组收集参数、用字典收集关键字参数等);
    可以达到在实例化类时,为相应的属性传入指定的值 
    

    注意 python3.x 版本 print是一个函数。而python2.x是一个语句

    作业

    修改上次课中定义的Box,要求其具有:
    访问私有属性体积的方法
    添加颜色属性(_color)和设置与获取Box的颜色的方法
    添加打开和关闭盒子的方法,并限制Box打开(关闭)之后
    再次调用打开(关闭)方法会给予提示:即不能重复关闭与打开。
    主程序中实例化并进行测试
    

    深入类的属性

    同名的类属性与实例属性

    以实例名.属性名引用时,优先引用实例属性
    以类名.属性名引用时候,只能引用类属性
    

    属性访问的特殊方法(反射)

    提供用字符串来操作类的属性/方法的方式
    主要工具函数
        hasattr(obj_bname,‘属性名’) 是否有这个属性
        setattr(obj_bname,‘属性名’,值)
        getattr(obj_bname,‘属性名’) 取值
    

    属性包装

    将方法包装成属性,因此相关实现
        控制属性的类型或范围 
        虚拟属性(由其他属性处理后的来)
    三种属性操作
        可读:@propery
        可写:@<property-name>.setter
        可删:@<property-name>.deleter
    

    类和实例是什么关系?

    类的属性和方法分别代表什么?

    类实例化的基本步骤是什么?

  • 相关阅读:
    人脉是麻烦出来的
    oracle撤销表空间和回滚段
    linux虚拟机ip地址更改
    linux各个文件夹的用途
    Apache的配置文件http.conf参数含义详解
    账户管理_新建用户_用户组
    【刷题】BZOJ 3994 [SDOI2015]约数个数和
    【刷题】BZOJ 2301 [HAOI2011]Problem b
    【刷题】洛谷 P3455 [POI2007]ZAP-Queries
    【刷题】BZOJ 2820 YY的GCD
  • 原文地址:https://www.cnblogs.com/richiewlq/p/7358615.html
Copyright © 2011-2022 走看看