Python类与面向对象

面向对象程序

程序 = 指令 + 数据

代码可以选择以指令为核心或以数据为核心进行编程

两种范例

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.重载操作符

特殊方法允许类通过重载标准操作符+,*,甚至包括分段下标即映射操作[]来模拟标准类型

—————————————————————————————————————————————————————

做有思想的新青年

本文来自企鹅号 - 全球大搜罗媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

C++ explicit禁止单参数构造函数隐式调用

C++中单参数构造函数是可以被隐式调用的,主要有两种情形会隐式调用单参数构造函数: (1)同类型对象的拷贝构造;即用相同类型的其它对象来初始化当前对象。 (...

23250
来自专栏前端那些事

强大的原型和原型链

前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了...

19780
来自专栏前端那些事

强大的原型和原型链

前两次总结了JavaScript中的基本数据类型(值类型<引用类型>,引用类型<复杂值>)以及他们在内存中的存储,对内存空间有了一个简单的了解,以及第二次总结了...

218100
来自专栏余林丰

Java中的Object、T(泛型)、?区别

因为最近重新看了泛型,又看了些反射,导致我对Object、T(以下代指泛型)、?产生了疑惑。 我们先来试着理解一下Object类,学习Java的应该都知道Obj...

274100
来自专栏WindCoder

《简明 Python 教程》学习笔记-控制流

1.为内建的raw_input函数提供一个字符串,这个字符串被打印在屏幕上,然后等待用户的输入。一旦我们输入一些东西,然后按回车键之后,函数返回输入。对于raw...

7400
来自专栏GreenLeaves

JavaScript之引用类型介绍

       引用类型的值(对象)是应用类型的一个实例。在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,用于将数据和功能组织在一起...

21590
来自专栏PhpZendo

震惊 php empty 函数判断结果为空,但实际值却为非空

最近我在一个项目中使用 empty 时获取到了一些意料之外的结果。下面是我处理后的调试记录,在这里与你分享了。

15010
来自专栏思考的代码世界

Python编程从入门到实践之函数|第8天

函数是带名字的代码块,用于完 成具体的工作。要执行函数定义的特定任务,可调用该函数。需要在程序中多次 执行同一项任务时,你无需反复编写完成该任务的代码,而只需调...

36470
来自专栏全沾开发(huā)

学习zepto.js(原型方法)[1]

学习zepto.js(原型方法)[1] 新的一周,新的开始,今天来学习一下zepto里边的原型方法,就是通过$.进行调用的方法,也是可...

40390
来自专栏武军超python专栏

2018年7月26日python中面向对象中的封装

9420

扫码关注云+社区

领取腾讯云代金券