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使用PyV8执行javascript代码示例分享
Dec 04 Python
Python中的Numeric包和Numarray包使用教程
Apr 13 Python
Python网站验证码识别
Jan 25 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
Python中collections模块的基本使用教程
Dec 07 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
Oct 23 Python
tensorflow 限制显存大小的实现
Feb 03 Python
python3通过udp实现组播数据的发送和接收操作
May 05 Python
keras多显卡训练方式
Jun 10 Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 Python
在Django中使用MQTT的方法
May 10 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
PHP绕过open_basedir限制操作文件的方法
2018/06/10 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
JavaScript入门教程 Cookies
2009/01/31 Javascript
jQuery 源码分析笔记(5) jQuery.support
2011/06/19 Javascript
jQuery的显示和隐藏方法与css隐藏的样式对比
2013/10/18 Javascript
javascript loadScript异步加载脚本示例讲解
2013/11/14 Javascript
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
js文本框输入内容智能提示效果
2015/12/02 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
使用DataTable插件实现异步加载数据
2017/11/19 Javascript
在react-router4中进行代码拆分的方法(基于webpack)
2018/03/08 Javascript
Node.js Buffer用法解读
2018/05/18 Javascript
vue 刷新之后 嵌套路由不变 重新渲染页面的方法
2018/09/13 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
浅谈JavaScript 代码整洁之道
2018/10/23 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
layui 上传图片 返回图片地址的方法
2019/09/26 Javascript
VSCode插件安装完成后的配置(常用配置)
2020/08/24 Javascript
微信小程序实现首页弹出广告
2020/12/03 Javascript
python+requests+unittest API接口测试实例(详解)
2017/06/10 Python
Python实现自动为照片添加日期并分类的方法
2017/09/30 Python
python将unicode和str互相转化的实现
2020/05/11 Python
浅谈pytorch中torch.max和F.softmax函数的维度解释
2020/06/28 Python
Python常用类型转换实现代码实例
2020/07/28 Python
HTML5 input placeholder 颜色修改示例
2014/05/30 HTML / CSS
skyn ICELAND官网:冰岛成分天然护肤品
2020/08/24 全球购物
动物学专业毕业生求职信
2013/10/11 职场文书
《庐山的云雾》教学反思
2014/04/22 职场文书
离婚协议书范文
2015/01/26 职场文书
防震减灾主题班会
2015/08/14 职场文书
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android
centos7安装mysql5.7经验记录
2022/05/02 Servers