python基础教程之面向对象的一些概念


Posted in Python onAugust 29, 2014

Python使用类(class)和对象(object),进行面向对象(object-oriented programming,简称OOP)的编程。

面向对象的最主要目的是提高程序的重复使用性。我们这么早切入面向对象编程的原因是,Python的整个概念是基于对象的。了解OOP是进一步学习Python的关键。

下面是对面向对象的一种理解,基于分类。

相近对象,归为类

在人类认知中,会根据属性相近把东西归类,并且给类别命名。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都在鸟类的原型基础上的。

面向对象就是模拟了以上人类认知过程。在Python语言,为了听起来酷,我们把上面说的“东西”称为对象(object)。

先定义鸟类

class Bird(object):

    have_feather = True

    way_of_reproduction  = 'egg'

我们定义了一个类别(class),就是鸟(Bird)。在隶属于这个类比的语句块中,我们定义了两个变量,一个是有羽毛(have_feather),一个是生殖方式(way_of_reproduction),这两个变量对应我们刚才说的属性(attribute)。我们暂时先不说明括号以及其中的内容,记为问题1。

假设我养了一只小鸡,叫summer。它是个对象,且属于鸟类。使用前面定义的类:

summer = Bird()

print summer.way_of_reproduction

通过第一句创建对象,并说明summer是类别鸟中的一个对象,summer就有了鸟的类属性,对属性的引用是通过 对象.属性(object.attribute) 的形式实现的。

可怜的summer,你就是个有毛产的蛋货,好不精致。

动作

日常认知中,我们在通过属性识别类别的时候,有时根据这个东西能做什么事情来区分类别。比如说,鸟会移动。这样,鸟就和房屋的类别区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。

这样的一些“行为”属性为方法(method)。Python中通过在类的内部定义函数,来说明方法。

class Bird(object):

    have_feather = True

    way_of_reproduction = 'egg'

    def move(self, dx, dy):

        position = [0,0]

        position[0] = position[0] + dx

        position[1] = position[1] + dy

        return position
summer = Bird()

print 'after move:',summer.move(5,8)

我们重新定义了鸟这个类别。鸟新增一个方法属性,就是表示移动的方法move。(我承认这个方法很傻,你可以在看过下一讲之后定义个有趣些的方法)

(它的参数中有一个self,它是为了方便我们引用对象自身。方法的第一个参数必须是self,无论是否用到。有关self的内容会在下一讲展开)

另外两个参数,dx, dy表示在x、y两个方向移动的距离。move方法会最终返回运算过的position。

在最后调用move方法的时候,我们只传递了dx和dy两个参数,不需要传递self参数(因为self只是为了内部使用)。

我的summer可以跑了。

子类

类别本身还可以进一步细分成子类

比如说,鸟类可以进一步分成鸡,大雁,黄鹂。

在OOP中,我们通过继承(inheritance)来表达上述概念。

class Chicken(Bird):

    way_of_move = 'walk'

    possible_in_KFC = True
class Oriole(Bird):

    way_of_move = 'fly'

    possible_in_KFC = False
summer = Chicken()

print summer.have_feather

print summer.move(5,8)

新定义的鸡(Chicken)类的,增加了两个属性:移动方式(way_of_move),可能在KFC找到(possible_in_KFC)

在类定义时,括号里为了Bird。这说明,Chicken是属于鸟类(Bird)的一个子类,即Chicken继承自Bird。自然而然,Bird就是Chicken的父类。Chicken将享有Bird的所有属性。尽管我只声明了summer是鸡类,它通过继承享有了父类的属性(无论是变量属性have_feather还是方法属性move)

新定义的黄鹂(Oriole)类,同样继承自鸟类。在创建一个黄鹂对象时,该对象自动拥有鸟类的属性。

通过继承制度,我们可以减少程序中的重复信息和重复语句。如果我们分别定义两个类,而不继承自鸟类,就必须把鸟类的属性分别输入到鸡类和黄鹂类的定义中。整个过程会变得繁琐,因此,面向对象提高了程序的可重复使用性。

(回到问题1, 括号中的object,当括号中为object时,说明这个类没有父类(到头了))

将各种各样的东西分类,从而了解世界,从人类祖先开始,我们就在练习了这个认知过程,面向对象是符合人类思维习惯的。所谓面向过程,也就是执行完一个语句再执行下一个,更多的是机器思维。通过面向对象的编程,我们可以更方便的表达思维中的复杂想法。

总结

将东西根据属性归类 ( 将object归为class )

方法是一种属性,表示动作

用继承来说明父类-子类关系。子类自动具有父类的所有属性。

self代表了根据类定义而创建的对象。

建立对一个对象: 对象名 = 类名()

引用对象的属性: object.attribute

Python 相关文章推荐
Python多进程机制实例详解
Jul 02 Python
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
对python numpy数组中冒号的使用方法详解
Apr 17 Python
详解通过API管理或定制开发ECS实例
Sep 30 Python
IntelliJ IDEA安装运行python插件方法
Dec 10 Python
树莓派采用socket方式文件传输(python)
Jun 22 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python TK库简单应用(实时显示子进程输出)
Oct 29 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
Dec 04 Python
基于Python实现扑克牌面试题
Dec 11 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
Dec 12 Python
Python可视化神器pyecharts绘制水球图
Jul 07 Python
初学Python实用技巧两则
Aug 29 #Python
python基础教程之自定义函数介绍
Aug 29 #Python
python爬虫常用的模块分析
Aug 29 #Python
python基础教程之循环介绍
Aug 29 #Python
Python中optionParser模块的使用方法实例教程
Aug 29 #Python
python基础教程之缩进介绍
Aug 29 #Python
python基础教程之常用运算符
Aug 29 #Python
You might like
PHP获取表单textarea数据中的换行问题
2010/09/10 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
smarty表格换行实例
2014/12/15 PHP
php include类文件超时问题处理
2015/02/06 PHP
PHP使用curl模拟post上传及接收文件的方法
2016/03/04 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
响应鼠标变换表格背景或者颜色的代码
2009/03/30 Javascript
js中通过父级进行查找定位元素
2014/06/15 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
JavaScript中实现依赖注入的思路分享
2015/01/15 Javascript
学习jQuey中的return false
2015/12/18 Javascript
关于JS中setTimeout()无法调用带参函数问题的解决方法
2016/06/21 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
JS获取子、父、兄节点方法小结
2017/08/14 Javascript
基于原生js运动方式关键点的总结(推荐)
2017/10/01 Javascript
微信小程序实现image组件图片自适应宽度比例显示的方法
2018/01/16 Javascript
详解JavaScript中typeof与instanceof用法
2018/10/24 Javascript
微信小程序使用template标签实现五星评分功能
2018/11/03 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
[31:33]2014 DOTA2国际邀请赛中国区预选赛 TongFu VS DT 第一场
2014/05/23 DOTA
[00:32]DOTA2上海特级锦标赛 COL战队宣传片
2016/03/04 DOTA
python并发2之使用asyncio处理并发
2017/12/21 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
澳大利亚婴儿礼品公司:The Baby Gift Company
2018/11/04 全球购物
三查三看党性分析材料
2014/02/18 职场文书
运动会口号8字
2014/06/07 职场文书
2014年设计师工作总结
2014/11/25 职场文书
社会实践活动总结
2015/02/05 职场文书
重阳节简报
2015/07/20 职场文书
《雷雨》教学反思
2016/02/20 职场文书
python3操作redis实现List列表实例
2021/08/04 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
MyBatis XPathParser解析器使用范例详解
2022/07/15 Java/Android