#007 - python类

OOP:Object-Oriented Programming 面向对象编程

类型由状态集合(数据)和转换这些状态的操作集合组成

类:

  • 属性
  • 行为(方法)
  • 方法和变量:
    • 私有:内部使用
    • 公共:外部可见

如何利用对象完成真正有用的工作?

  • 必须有一种方法能向对象发出请求,令其做一些事情
  • 每个对象仅能接受特定的请求
    • 能向对象发送的请求由其“接口”进行定义
    • 对象的“类型”或“类”则规定了它的接口形式

万物皆对象

对象:

  • 所有东西都是对象
  • 程序是一大堆对象的集合
  • 每个对象都有自己的存储空间,并可容纳其他对象
    • 通过封装现有对象,可以制作成新型对象
  • 每个对象都属于某一类型
  • 同一个类的所有对象都能接受相同的消息

类间关系:

  • 依赖关系(“uses - a”)
    • 一个类的方法操纵另一个类的对象
  • 聚合(“has - a”)
    • 比如a对象里有整形对象,字符串对象,列表对象…就说a “has a “ int,string对象
  • 继承(“is - a”)

面向对象的编程原则:

  • 继承(Inheritance)
    • 一个对象获得另一个对象属性的过程,用于实现按层分类的概念
    • 一个深度继承的子类继承了类层次中它的每个祖先的所有属性
    • 超类、基类、父类
    • 子类、派生类(即拥有父类的属性,又有自己独特的属性)
  • 封装
    • 隐藏实现方案细节
    • 将代码及处理的数据绑定在一起的一种编程机制,用于保证程序和数据不受外部干扰且不会被误用
  • 多态(Polymorphism)
    • 一个接口被多个通用的类动作使用的特性,具体使用哪个动作与应用场合相关
    • “一个接口,多个方法”
      • 用于为一组相关的动作设计一个通用的接口,以降低程序的复杂度

python类和实例

  • 实例初始化
    • 通过调用类来创建实例
      • instance = ClassName(args…)
    • 类在实例化时可以使用initdel两个特殊的方法
  • 创建类:使用class关键字
    • class ClassName(bases):
      • ‘’class documentation string’’
      • class_suite
    • 超类是一个或多个用于集成的父类的集合
    • 类体可以包含:声明语句、类成员定义、数据属性、方法
    • 如果不存在继承关系,ClassName后面的“(bases)”可以不提供,类文档可选
    • 类是可执行代码,直到运行后类对象才会存在。类定义运行后,生成类类对象,类实例化后才是类实例对象,两者不同。
    • myinstance.method() = class.method(myinstance)
    • python规定,没有实例方法不允许调用,此即为“绑定”

Python类和实例的属性

  • class语句中的复制语句会创建类属性,类属性相当于java中的静态变量,实例对象所共享的资源
  • 在类方法中对传给方法的特殊参数self进行赋值会创建实例属性
    • class MyClass():
      • gender = ‘’male’’ 类属性
      • def setName(self, who):
        • self.name = who 实例属性

python构造器

  • 创建实例时,Python会自动调用类中的init方法,以隐性地为实例提供属性
  • init方法被称为构造器
  • 如果类中没有定义init方法,实例创建之初仅是一个简单的名称空间,仅有名字
  • class Animal:
  • name = ’someone’ 数据属性(成员变量)
    • def init(self , voice = ‘HI’): 重载构造函数
      • self.voice = voice
    • def del(self): 重载析构函数
      • pass
    • def saySomething(self): 方法属性(成员函数)
      • print self.voice

类的特殊属性
* 可以使用类的dict字典属性或python内置的dir()函数来获取类的属性
* MyClass.__dict
* dir(MyClass)

python类方法中可用的变量

  • 实例变量:指定变量名称及实例自身进行引用
    • self.变量名
  • 局部变量:方法内部创建的变量,可直接使用
  • 类变量(静态变量):通过指定变量名与类名进行引用
    • 类名.变量名
  • 全局变量:直接使用
  • 注意:假如A类中有变量a,创建两个A类的对象A1,A2,在创建A1,A2的时候,A1,A2自己会在自己的名称空间中找变量a,自己没有,则向上爬树,在A类名称空间中找变量a,找到并复制一份到自己名称空间去,也就是说A1,A2对象分别有了一份变量a的copy

继承:

  • 继承描述了积累的属性如何“遗传”给派生类
    • 子类可以继承它的基类的任何属性,包括数据属性和方法
    • 一个未指定基类的类,其默认有一个名为object的基类(对于Python3来讲)
    • Python允许多继承
  • 创建子类
    • 创建子类时,只需要在类名后跟一个或从其中派生的父类
    • class SubClassName(ParentClass1[,ParentClass2,…]):
      • ‘optional class documentation string’
      • class-suite
  • 对比属性和方法
    • dir(ParentClass)
    • dir(ChildClass)
  • 爬树优先级,至底向上
  • 继承方法专用化
    • 子类可以完全取代从超类继承而来的属性
    • 也可以通过已覆盖的方法回调超类来扩展超类的方法:ParClass.setInfo(self)

类、实例和其他对象的内建函数

  • issubclass()
    • 布尔函数,判断一个类是否由另一个类派生,语法:
      • issubclass(sub,sup)
  • isinstance()
    • 布尔函数,判断一个对象是否是给定类的实例,语法:
      • isinstance(obj1,class_obj2)
  • hasattr()
    • 布尔函数,判断一个对象是否拥有指定的属性,语法:
      • hasattr(obj,’attr’)
    • 同类的函数还有getattr()、setattr()和delattr()
  • super()
    • 在字类中找出其父类以便于调用其属性
    • 一般情况下仅能采用非绑定方式调用祖先类方法
    • 而super()可用于传入实例或类型对象,语法:
      • super(type[,obj])

运算符重载

  • 运算符重载是指在方法中拦截内置的操作 - 当类的实例出现在内置操作中,Python会自动调用自定义方法,并且返回自定义方法的操作结果
    • 运算符重载让类拦截常规的Python运算
      • 类可重载所有Python表达式运算符
      • 类也可重载打印、函数调用、属性点号运算等内置运算
    • 重载使类实例的行为像内置类型
    • 重载通过提供特殊名称的类方法实现
  • 重载并非必须
  • 基于特殊方法定制类

注意:从Python2.2开始,引入新式类,分为经典类和新式类,但是到了Python3已经没有了经典类!

猜你喜欢

转载自blog.csdn.net/aarron_dl/article/details/80207359
007