帮Python找“对象”

  说是要“找对象”,我们第一个看的却是个叫作“类”的语法结构。这里的类其实和我们日常生活中的“类”的概念差不多。日常生活中,我们把相近的东西归为一类,而且给这个类起一个名字。比如说,鸟类的共同属性是有羽毛,通过产卵生育后代。任何一只特别的鸟都是建立在鸟类的原型基础上的。
  下面我们用Python 语言来记录上面的想法,描述鸟类:

class Bird(object):
feather = True
reproduction = "egg"

  在这里,我们用关键字class 来定义一个类。类的名字就是鸟(Bird)。括号里有一个关键词object,也就是“东西”的意思,即某一个个体。在计算机语言中,我们把个体称为对象。一个类别下,可以有多个个体。鸟类就可以包括邻居老王养的金丝雀、天边正飞过的那只乌鸦,以及家里养的一只小黄鸡。
  冒号和缩进说明了属于这个类的代码。在隶属于这个类别的程序块中,我们定义了两个量,一个用于说明鸟类有羽毛(feather),另一个用于说明鸟类的繁殖方式(reproduction),这两个量称为类的属性(attribute)。我们定义鸟类的方法很粗糙,鸟类只不过是“有毛能产蛋”的东西。要是生物学家看到了大概会暗自摇头,但我们毕竟迈出了模拟世界的第一步。
  我们除了用数据性的属性来分辨类别外,有时也会根据这类东西能做什么事情来区分。比如说,鸟会移动。这样,鸟就和房屋的类别就区分开了。这些动作会带来一定的结果,比如移动导致位置的变化。这样的一些“行为”属性称为方法(method)。Python 中,一般通过在类的内部定义函数来说明方法。

class Bird(object):
feather = True
reproduction = "egg"
def chirp(self, sound):
print(sound)

  我们给鸟类新增一个方法属性,就是表示鸟叫的方法chirp()。方法chirp()看起来很像一个函数。它的第一个参数是self,是为了在方法内部引用对象自身,我将在后面详细解释。需要强调的是,无论该参数是否用到,方法的第一个参数必须是用于指代对象自身的self。剩下的参数sound 是为了满足我们的需求设计的,它代表了鸟叫的内容。方法chirp()会把sound 打印出来。

对象

  我们定义了类,但和函数定义一样,这还只是打造兵器的过程。为了使用这个利器,我们需要深入到对象的层面。通过调用类,我们可以创造出这个类下面的一个对象。比如说,我养了一只小鸡,叫summer。它是个对象,且属于鸟类。我们使用前面已经定义好的鸟类,产生这个对象:

summer = Bird()

  通过这一句创建对象,并说明summer 是属于鸟类的一个对象。现在,我们就可以使用鸟类中已经写好的代码了。作为对象的summer 将拥有鸟类的属性和方法。对属性的引用是通过对象.属性(object.attribute)的形式实现的。比如说:

print(summer.reproduction) # 打印'egg'

  用上面的方式,我们得到summer 所属类的繁殖方式。
  此外,我们还可以调用方法,让summer 执行鸟类允许的动作。比如:

summer.chirp("jijiji") # 打印'jijiji'

  在调用方法时,我们只传递了一个参数,也就是字符串"jijiji"。这正是方法与函数有所区别的地方。尽管在定义类的方法时,我们必须加上这个self 参数,但self 只用能在类定义的内部,所以在调用方法时不需要对self 传入数据。通过调用chirp()方法,我的summer 就可以叫了。
  到现在为止,描述对象的数据都存储于类的属性中。类属性描述了一个类的共性,比如鸟类都有羽毛。所有属于该类的对象会共享这些属性。比如说,summer 是鸟类的一个对象,因此summer 也有羽毛。当然,我们可以通过某个对象来引用某个类属性。
  对于一个类下的全部个体来说,某些属性可能存在个体差异。比如说,我的summer 是黄色的,但并非所有的鸟儿都是黄色的。再比如说人这个类。性别是某个人的一个性质,不是所有的人类都是男,或者都是女。这个性质的值随着对象的不同而不同。李雷是人类的一个对象,性别是男。韩美美也是人类的一个对象,性别是女。
  因此,为了完整描述个体,除了共性的类属性外,我们还需要用于说明个性的对象属性。在类中,我们可以通过self 来操作对象的属性。现在我们拓展Bird 类:

class Bird(object):
def chirp(self, sound):
print(sound)
def set_color(self, color):
self.color = color

summer = Bird()
summer.set_color("yellow")
print(summer.color) # 打印'yellow'

  在方法set_color()中,我们通过self 参数设定了对象的属性color。和类属性一样,我们能通过对象.属性的方式来操作对象属性。由于对象属性依赖于self,所以我们必须在某个方法内部才能操作类属性。因此,对象属性没办法像类属性一样,在类下方直接赋初值。
  但Python 还是提供了初始化对象属性的办法。Python 定义了一系列特殊方法。特殊方法又被称为魔法方法(Magic Method)。特殊方法的方法名很特别,前后有两个下画线,比如__init__()、__add__()、__dict__()等。程序员可以在类定义中设定特殊方法。Python 会以特定的方式来处理各个特殊方法。对于类的__init__()方法,Python 会在每次创建对象时自动调用。因此,我们可以在__init__()方法内部来初始化对象属性:

class Bird(object):
def __init__(self, sound):
self.sound = sound
print("my sound is:", sound)
def chirp(self):
print(self.sound)

summer = Bird("ji")
summer.chirp() # 打印'ji'

  在上面的类定义中,我们通过__init__()方法说明了这个类的初始化方式。每当对象建立时,比如创建summer 对象时,__init__()方法就会被调用。它会设定sound 这个对象属性。在后面的chirp()方法中,就可以通过self 调用这一对象属性。除了设定对象属性外,我们还可以在__init__()中加入其他指令。这些指令会在创建对象时执行。在调用类时,类的后面可以跟一个参数列表。这里放入的数据将传给__init__()的参数。通过__init__()方法,我们可以在创建对象时就初始化对象属性。
  除了操作对象属性外,self 参数还有另外一个功能,就是能让我们在一个方法内部调用同一类的其他方法,比如:

class Bird(object):
def chirp(self, sound):
print(sound)

def chirp_repeat(self, sound, n):
for i in range(n):
self.chirp(sound)

summer = Bird()
summer.chirp_repeat("ji", 10) # 重复打印'ji'10 次

  在方法chirp_repeat()中,我们通过self 调用了类中的另一个方法chirp()。

  Python的对象很多也很有趣,比如前面的文章《那些Python意想不到的对象》。若与这些对象深入交往,你会发现Python更多的魔力。更多内容可见《从Python开始学编程》一书。

  本文选自《从Python开始学编程》,点此链接可在博文视点官网查看此书。
                     

  想及时获得更多精彩文章,可在微信中搜索“博文视点”或者扫描下方二维码并关注。
                       

时间: 2024-09-30 21:00:33

帮Python找“对象”的相关文章

蚕豆网精品APP推荐第64期:帮你找对象App大推荐

每日看酷闻,当日新鲜IT资讯全Hold住,移动互联耍酷玩Fashion尽在蚕豆!欢迎订阅 蚕豆网.[海外酷站]情人节邂逅Mr.Right 网站应用齐上阵又见 圣瓦伦丁节,有伴儿的你准备好礼物了么?也许为了这一天的到来你老早就下血本定好了Pizza Hut推出的价值10,010美元的豪华求婚套餐:搭配订购了LV套套--什么?还没找到另一半?那就跟随小编一起逛好玩的网站.应用寻觅情人节那个属于你的Mr.Right!点击这里,快去试试吧![产品创新]谷歌升级Google TV YouTube应用谷歌今

网速为何慢?Mac 活动监视器帮你找出原因

  网速为何慢?Mac 活动监视器帮你找出原因         对于 Mac 用户来说市面上存在不少的网络用量监视器,为了提升上网速度,不少用户都希望通过此类型的工具来查看网速都用在了什么地方,又或者是限制那些"占网大户"的网络.但 Mac 的新用户们,你是否知道系统中的活动监视器中已经提供了类似的功能? 打开 Mac 系统中的活动监视器后,注意顶部会出现 5 个标签页,分别是 CPU.内存.能耗.磁盘和网络.选择最后一个"网络",在这里你可以看到电脑上的每一个进程

c语言 树结构 二叉树-初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪

问题描述 初学二叉树 运行有错误 瞅了几个小时无果 大神帮帮忙 找出错误在哪 ![图片说明](http://img.ask.csdn.net/upload/201503/07/1425715444_303984.png #include #include typedef struct Tree { int date; struct Tree *lson,*rson; }tree , *ztree; int a[200005]; ztree creat(ztree t,int n) { int h

【干货】怎样用数据分析找对象

上篇 写在前面 在工作中,经常利用多个数据指标对整体进行综合评价,需要把多个数据压缩成一个综合指标,这就是多指标综合评价方法. 耐心学完本期内容,足够装X一整年. 专业内容 专业术语的名称能吓死人,不用深究. 实际内容很简单,一个案例你就可以完全掌握. 一个案例 富帅们看着美女数据,在进行激烈的讨论...   那么,李富帅喜欢的"综合起来最好的"类型,到底是哪个?  小龙女是最好的?虽然她最高,但是体重和胸围都不是最优的 赵敏头发是最长的,但是其他数据也不是最好 要找出"综合

IT男婚恋报告:每月1万不够花 8成网上找对象

从事时尚的http://www.aliyun.com/zixun/aggregation/7138.html">互联网工作,但婚恋也许不能"联网".一份"IT男婚恋报告"昨天出炉,受到生活圈子窄.工作环境中女性少.不善言辞等因素影响,IT男已成为"剩男"中的一大群体.这份报告统计,8成以上的IT男通过网络找对象,在婚恋网站上的活跃度,竟然比普通男会员高9倍. IT男每月1万块都不够花 按照"IT男婚恋报告"中的

SQLObject v1.1发布 Python数据库对象映射框架

SQLObject 1.1.0 发布,SQLObject 是一个流行的Python 数据库对象映射框架,映射的规则就是表->类.字段->属性. 过提供用于操作数据库表的类和对象,对象关系映射工具有助于提高生产率.Python 最好的对象关系映射工具是 SQLObject -- 一个开放源码项目,它几乎完成编程数据库所需的所有操作.本文介绍 SQLObject 及其功能.阅读本文后,您将能够不编写任何 SQL 代码而连接 Python 与数据库. 当面向对象编程范例满足大多数数据库的关系范例时,

json-麻烦哪位好心人帮我找一下,rails用dynatree怎么写树形菜单的,不需要数据库。。

问题描述 麻烦哪位好心人帮我找一下,rails用dynatree怎么写树形菜单的,不需要数据库.. 试用期的伤不起啊.以前都是java主要是对rais不熟啊.我只能写点javascript,对于数据的传递不知道ruby是怎么弄得

Python中对象迭代与反迭代的技巧总结_python

一.如何实现可迭代对象和迭代器对象? 实际案例 某软件要求从网络抓取各个城市气味信息,并其次显示: 北京: 15 ~ 20 天津: 17 ~ 22 长春: 12 ~ 18 ...... 如果一次抓取所有城市天气再显示,显示第一个城市气温时,有很高的延时,并且浪费存储空间,我们期望以用时访问的策略,并且把所有城市气温封装到一个对象里,可用for语句进行迭代,如何解决? 解决方案 实现一个迭代器对象Weatherlterator,next方法每次返回一个城市气温,实现一个可迭代对象Weatherlt

龚海燕产业链:先培养学霸再为学霸找对象

龚海燕在纳斯达克龚海燕产业链:先培养学霸,再为学霸找对象放弃"91外教网",转战基础在线教育,成立"梯子网".在继"妈妈再也不用担心我孤独终老"之后,"小龙女"能让"妈妈能再也不用担心我的学习"成为现实吗?文/本刊记者李春晖"91外教网"不满周岁,龚海燕已果断调整思路,转战k12(kindergarten throughtwelfth grade,即基础教育)在线教育.11月24日,基础