面向对象程序
程序 = 指令 + 数据
代码可以选择以指令为核心或以数据为核心进行编程
两种范例
1.以指令为核心:围绕"正在发生什么"编写
面向过程编程:程序具有一系列线性步骤:主体思想是代码作用于数据
2.以数据为核心:围绕“将影响谁”进行编写
面向对象编程:围绕数据以及数据严格定义的接口来组织程序用数据控制对代码的访问
面向编程语言的最终目的都是提供一种抽象方法
在机器模型("解空间"或“方案空间”)与实际解决的问题模型(“问题空间”)之间,程序必须建立一种联系
1.面向过程:程序 = 算法 +数据结构
2.面向对象:将问题空间中的元素以及它们在解空间中表示物抽象为对象,并允许通过问题来描述问题而不是方案
可以把对象想象成一种新型变量,它保存着数据,但可以对自身的数据执行操作。
类型由状态集合(数据)和变换这些状态的操作集合组成
类抽象
类:定义了被多个同一个类型对象共享结构和行为(数据和代码)
类的数据和代码
数据:成员变量或实例变量
成员方法:简称为方法,是操作数据的代码,用于定义如何使用成员变量,因此一个类的行为和接口是通过方法来定义的
方法和变量:
私有:内部使用
公共:外部可见
面向对象的程序设计方法
所有的东西都是对象
程序是一大堆对象的组合
通过消息传递,各对象知道自己该做什么
消息:即调用请求,它调用的是从属目标对象的一个方法
每个对象都有自己的存储空间,并可容纳其它对象
通过封装现有的对象,可以制作新型对象
每个对象都属于某一类型
1.类型,即类
2.对象是类的实例
3.类的一个重要特性为“能发什么样的消息给它”
同一个类的所有对象都能接收相同的消息
对象的接口
定义一个类后,可以根据需要实例化出多个对象
如何利用对象完成真正有用的工作?
必须有一种方法能向对象发出请求,令其做一些事情
每个对象仅能接收特定的请求
1.能向对象发送的请求由其“接口”进行定义
2.对象的“类型”或"类"规定了它的接口形式
归纳:将同一种具体物事的共同特性抽象出来的表现
状态和转换这些状态的操作
数据:
变量:类属性
方法:
函数:操作变量引用数据的代码
类间关系
依赖:一个类的方法操作另外一个类的对象
聚合:类A的对象包含类B的对象
继承:描述特殊与一般的关系
面向对象编程的原则
面向对象的模型机制3个原则:封装、继承、多态
封装:
隐藏实现方案细节
将代码及其处理的数据绑定在一起的一种编程机制,用于保证程序和数据不受外部干扰且不会被误用
继承:
1.一个对象获得另一个对象属性的过程,用于实现按层分类的概念
2.一个深度继承的子类继承了类层次中它的每个祖先的所有属性
3.超类、基类、父类
4.子类、派生类
多态:
允许一个接口被多个通用的类动作使用的特性,具体哪个动作与应用场合相关
一个接口,多个方法
用于为一组相关的动作设计一个通用的接口,以降低程序的复杂性
Python类和实例
类是一种数据结构,可用于创建实例
一般情况下,类封装了数据和可用于该数据的方法
Python类是一个可调用对象,即类对象
Python2.2之后,类是一种自定义类型,而实例则是声明某个自定义类型的变量
实例初始化
通过调用类来创建实例
instance = ClassName(args……)
类在实例化时可以使用_init_和_del_两种特殊的方法
Python中创建类
1Python使用class关键字创建类,语法格式如下
class ClassName(bases):
class_suite
2超类是一个或多个用于继承父类的集合。
3类体可以包含:声明语句、类成员定义、数据属性、方法
4注意:
如果不存在继承关系,ClassName后面“(bases)”可以不提供
类文档为可选
5 Class语句的一般形式
data = value
def method(self,……)
self.member = value
6 Python中,class
例子: class FirstClass():
data = "hello class"
def printdata(self):
print self.data
insl = FirstClass()
insl.data或者 insl.printdata()
Python类方及调用
实例(对象)通常包含属性
1 可调用的属性:方法
2 数据属性
在OOP中,实例就像是带有数据的纪律,而类是处理这些记录的程序
通过实例调用方法相当于调用所属的方法来处理当前实例
类似instance.method(args..)会被自动转换为class.method(instance,args..)
前面的例子,x.display()会被自动转换为FirstClass.display(x),即调用类的方法处理实例x
因此,类中每个方法必须具有self参数,它隐含当前实例之意
在方法内对self属性做复制运算会产生实例自己的属性
Python规定,没有实例,方法不允许被调用
Python类和实例的属性
class语句中的赋值语句会创建类属性
在类方法中对传给方法的特殊参数self进行赋值会创建实例属性
Python构造器
创建实例时,Python会自动调用类的_init_方法,以隐性地为实例提供属性
_init_方法被称为构造器
如果类中没有定义_init_方法,实例创建之初是一个简单的名称空间
类的特殊属性
可以使用类的_dict_字典属性或Python内置的dir()函数来获取类的属性
实例属性
实例仅拥有数据属性(严格意义上来说,方法是类属性)
这些数据属性独立于其它实例或类
类方法中的可用变量
实例变量:指定变量名称及实例自身进行引用
如:self.变量名
局部变量:方法内部创建的变量,可直接使用
类变量(静态变量):通过指定变量名与类名进行引用
类名:变量名
全局变量:直接使用
继承:
继承描述了基类的属性如何“遗传”给派生类
子类可以继承它的基类的任何属性,包括数据属性和方法
一个未指定基类的类,其默认有一个名object的基类
Python允许多重继承
创建子类
创建子类时,只需要在类后跟一个或从其中派生的父类
class SubClassName(ParentClass1[,ParentClass2,..]
optional class documentation string
class_suite
Python类继承的例子
子类可以继承它的基类的任何属性
class ParentClass(object)
gender = 'Male'
def SetName(self,who)
self.name = who
class ChildClass(ParentClass):
print self.gender,self.name
x = ChildClass()
x.setName('tom')
x.displayInfo()
Male tom
dir(ParentClass)
Python类的继承和属性搜索
Python中几乎所有属性的获取都可以使用“object.attribute”的格式
不过,此表达式会在Python中启动搜索--搜索连续的树
class语句会产生一个类对象,对class的调用创建实例,实例自动连结至创建了此实例的类。
类连结至超类的方式
将超类列在类头部的括号内,其从左到右的顺序会决定树中的次序
由下至上,由左至右
继承方法专用化
继承先在子类寻找变量名,然后才查找超类,因此,子类以超类的属性重新定义来取代继承而来的行为
子类可以完全取代从超类继承而来的属性
也可以通过已覆盖的方法回调超类来扩展超类的方法
1.class ParClass(object):
def setInfo(self,sex= 'Male'
self.genda = sex
class ChiClass(ParClass):
def setInfo(self,who)
self.name = who
x = ChiClass()
x.setInfo('tom')
x.name
x.gender
2.class ParClass(object):
def setInfo(self,sex=='male'):
self.gender = sex
class ChiClass(ParClass):
def setInfo(self,who):
self.name = who
Parclass.setInfo(self)
类、实例和其它对象的内建函数
issubclass() 布尔函数,判断一个类是否由另一个类派生,语法
issubclass(sub,sup)
isinstance() 布尔函数,判断一个对象是否给定类的实例,语法
isinstance(obj1,class_obj2)
hasattr() 布尔函数,判断一个对象是否拥有指定的属性,语法
hasattr(obj,‘attr’)
同类的函数还有getattr(),setattr(),delattr()//获取,设置,删除
super()
1.在子类中找出其父类以便于调用其属性
2.一般情况下仅能采用非绑定方式调用祖先类方法
3.而super()可用于传入实例或类型对象,语法
super(type[,obj])
运算符重载
运算重载是指在方法中拦截内置的操作——当类的实例出现在内置操作中,Python会自动调用自定义的方法,并且返回自定义方法的操作结果
运算符重载让类拦截常规的Python运算
类可重载所有Python表达式运算符
类也可重载打印、函数调用、属性点号运算等内置运算
重载使类实例的行为像内置类型
重载通过提供特殊名称的类方法实现
运算符重载并非必需,并且通常也不是默认的
基于特殊的方法定制类
除了_init_和_del_之外,Python类支持使用许多特殊的方法
特殊方法都以双下划线开头和结尾,有些特殊方法的默认行为,没有默认行为的是为了留到需要的时候再实现
这些特殊方法是Python中用来扩充类的强大工具,他们可以实现
1.模拟标准类型
2.重载操作符
特殊方法允许类通过重载标准操作符+,*,甚至包括分段下标即映射操作[]来模拟标准类型
—————————————————————————————————————————————————————
做有思想的新青年
领取专属 10元无门槛券
私享最新 技术干货