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

类和实例是什么关系?

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

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

 

 

posted @ 2017-08-14 16:39  Richie`  阅读(222)  评论(0编辑  收藏  举报