有一个重要的概念你需要弄明白,那就是“类 (class)” 和“对象 (object)” 的区别。问题在于, class 和object 并没有真正的不同。它们其实是同样的东西,只是在不同的时间名字不同罢了。我用禅语来解释一下吧:

鱼和泥鳅有什么区别?

这个问题有没有让你有点晕呢?说真的,坐下来想一分钟。我的意思是说,鱼和泥鳅是不一样,不过它们其实也是一样的是不是?泥鳅是鱼的一种,所以说没什么不同,不过泥鳅又有些特别,它和别的种类的鱼的确不一样,比如泥鳅和黄鳝就不一样。所以泥鳅和鱼既相同又不同。怪了。

这个问题让人晕的原因是大部分人不会这样去思考问题,其实每个人都懂这一点,你无须去思考鱼和泥鳅的区别,因为你知道它们之间的关系。你知道泥鳅是鱼的一种,而且鱼还有别的种类,根本就没必要去思考这类问题。

让我们更进一步,假设你有一只水桶,里边有三条泥鳅。假设你的好人卡多到没地方用,于是你给它们分别取名叫小方,小斌,小星。现在想想这个问题:

小方和泥鳅有什么区别?

这个问题一样的奇怪,但比起鱼和泥鳅的问题来还好点。你知道小方是一条泥鳅,所以他并没什么不同,他只是泥鳅的一个“实例 (instance)” 。小斌和小星一样也是泥鳅的实例。我的意思是说,它们是由泥鳅创建出来的,而且代表着和泥鳅一样的属性。

所以我们的思维方式是(你可能会有点不习惯):鱼是一个“类 (class)” ,泥鳅是一个“类 (class)” ,而

小方是一个“对象 (object)” 。仔细想想,然后我再一点一点慢慢解释给你。

鱼是一个“类”,表示它不是一个真正的东西,而是一个用来描述具有同类属性的实例的概括性词汇。

你有鳍?你有鳔?你住在水里?好吧那你就是一条鱼。

后来河蟹养殖专家路过,看到你的水桶,于是告诉你:“小伙子,你这些鱼是泥鳅。” 专家一出,真相即现。并且专家还定义了一个新的叫做“泥鳅”的“类”,而这个“类”又有它特定的属性。细长条?

有胡须?爱钻泥巴?吃起来味道还可以?那你就是一条泥鳅。

最后家庭煮妇过来了,他跟河蟹专家说:“非也非也,你看到的是泥鳅,我看到的是小方,而且我要把小方和剁椒配一起做一道小菜。”于是你就有了一只叫做小方的泥鳅的“实例 (instance)” (泥鳅也是鱼的一个“实例”),并且你使用了它(把它塞到你的胃里了),这样它就是一个“对象 (object)” 。

这会你应该了解了:小方是泥鳅的成员,而泥鳅又是鱼的成员。这里的关系式:对象属于某个类,而某个类又属于另一个类。

写成代码是什么样子

这个概念有点绕人,不过实话说,你只要在创建和使用 class 的时候操心一下就可以了。我来给你两个区分 Class 和 Object 的小技巧。

首先针对类和对象,你需要学会两个说法,“ is-a( 是啥 )” 和“ has-a( 有啥 )” 。“是啥”要用在谈论“两者以类的关系互相关联”的时候,而“有啥”要用在“两者无共同点,仅是互为参照”的时候。

接下来,通读这段代码,将每一个注解为 ##?? 的位置标明他是“ is-a” 还是“ has-a” 的关系,并讲明白这个关系是什么。在代码的开始我还举了几个例子,所以你只要写剩下的就可以了。

记住,“是啥”指的是鱼和泥鳅的关系,而“有啥”指的是泥鳅和鳃的关系。

(译注:为了解释方便,译文使用了中文鱼名。原文使用的是“三文鱼 (salmon)” 和“大比目鱼(halibut)” ,名字也是英文常用人名。)

1

关于 class Name(object)

记得我曾经强迫让你使用 class Name(object) 却没告诉你为什么吧,现在你已经知道了“类”和“对象”的区别,我就可以告诉你原因了。如果我早告诉你的话,你可能会晕掉,也学不会这门技术了。

真正的原因是在 Python 早期,它对于 class 的定义在很多方面都是严重有问题的。当他们承认这一点的时候已经太迟了,所以逼不得已,他们需要支持这种有问题的 class 。为了解决已有的问题,他们需要引入一种“新类”,这样的话“旧类”还能继续使用,而你也有一个新的正确的类可以使用了。

这就用到了“类即是对象”的概念。他们决定用小写的“ object” 这个词作为一个类,让你在创建新类时从它继承下来。有点晕了吧?一个类从另一个类继承,而后者虽然是个类,但名字却叫“ object”…… 不过在定义类的时候,别忘记要从 object 继承就好了。

的确如此。一个词的不同就让这个概念变得更难理解,让我不得不现在才讲给你。现在你可以试着去理解“一个是对象的类”这个概念了,如果你感兴趣的话。

不过我还是建议你别去理解了,干脆完全忘记旧格式和新格式类的区别吧,就假设 Python 的 class 永远都要求你加上 (object) 好了,你的脑力要留着思考更重要的问题。

加分习题

1. 研究一下为什么 Python 添加了这个奇怪的叫做 object 的 class ,它究竟有什么含义呢?

2. 有没有办法把 Class 当作 Object 使用呢?

3. 在习题中为 animals 、 fish 、还有 people 添加一些函数,让它们做一些事情。看看当函数在Animal 这样的“基类 (base class)” 里和在 Dog 里有什么区别。

4. 找些别人的代码,理清里边的“是啥”和“有啥”的关系。

5. 使用列表和字典创建一些新的一对应多的“ has-many” 的关系。

6. 你认为会有一种“ has-many” 的关系吗?阅读一下关于“多重继承 (multiple inheritance)” 的资料,然后尽量避免这种用法。

常见问题回答

这些 ## ?? 注解是干嘛用的?

这些注解是供你填空的。你应该在对应的位置填入“ is-a” 、“ has-a” 的概念。重读这节习题,看看其它的注解,仔细理解一下我的意思。

这句 self.pet = None 有什么用?

确保类的 self.pet 属性被设置为 None 。

super(Employee,self).__init__(name) 是做什么用的?

这样你可以可靠地将父类的 __init__ 方法运行起来。搜索“ python super” ,看看它的优缺点。

词语练习

class:告诉python创造一个新的东西

object:两个意思:最基本的东西和任何实例化的东西。

instance:创建一个类得到的东西。

def:在类中创建一个函数。

self:在类里面的函数中使用,是实例和object能访问的变量。

inheritance:继承,一个类可以继承另一个类,像你和你的父母。

composition:一个类可以包含另外一个类,就像汽车包含轮胎。

attribute:一个属性类,通常包括变量。

is-a:表示继承关系

has-a:包含关系

通过卡片记忆这些词语,单独的词语通常没什么意义,不过我还是要先知道它们的存在。

短语练习

class x(y):创建一个类x,它继承了y类。

class x(object):def __init__(self,j):x类包含__init__函数,函数中有self和j参数。

class x(object):def m(self,j):类x包含m函数,m函数有self和j两个参数。

foo = x():设置foo为类x的实例化。

foo.m(j):通过foo调用m函数,参数是self和j。

foo.k = q:通过foo给k属性赋值为q。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

python从属关系编号_笨办法学Python 习题 42: 对象、类、以及从属关系相关推荐

  1. 笨办法学python在线阅读_笨办法学python全集.pdf

    TableofContents 笨办法学Python 1.1 序言 1.2 前言 1.3 简介 1.4 练习0.安装和准备 1.5 练习1.第一个程序 1.6 练习2.注释和井号"#&quo ...

  2. python转义例题_笨办法学Python记录--习题37 异常,lambda,yield,转义序列

    为什么使用异常 错误处理.事件通知.特殊情况处理.退出时的行为.不正常的程序流程. 简单的示例 在没有任何定义x变量的时候: print x print 1 将会抛出NameError异常: Name ...

  3. 笨办法学python pdf 第三版_笨办法学python第三版

    笨办法学python第三版pdf电子书是一本Python学习参考书,是美国程序员Zed A.Shaw编著,通过简单通俗的方法,结合内部的集体,让程序员学懂python,适用于初级学习python编程的 ...

  4. 笨办法学python第五版_笨办法学python PDF下载|笨办法学python第五版 电子版附目录_最火软件站...

    笨办法学Python第五版PDF电子版是专门为初学Python的朋友准备的一款电子图书资料,可以帮助你更好的学习Python编程知识,该电子书每章节都附带了常见问题回答以及练习题目,能够帮助学习者快速 ...

  5. Python入门书籍推荐——《笨办法学Python》

    很多小伙伴在学习Python的道路上,觉得越来越难.今天为小伙伴推荐一本非常适合Python小白的书籍<笨办法学Python>第三版. 在豆瓣有7.8的评分,学习Python的小伙伴千万不 ...

  6. 笨办法学python3进阶篇下载_笨办法学Python 3 进阶篇

    书名:"笨办法"学Python 3:进阶篇 定价:59.0 ISBN:9787115505392 作者: 泽德·A. 肖 版次:第1版 出版时间:2020-06 内容提要: 本书是 ...

  7. 笨办法学python3进阶篇_笨办法学Python 3 进阶篇

    第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...

  8. 笨办法学python3进阶篇下载_笨办法学Python 3:进阶篇

    第 一部分 准备知识 1 如果不喜欢作者的个人流程怎么办 2 如果发现自己太糟糕怎么办 2 习题0 准备工作 3 程序员用的编辑器 3 Python 3.6 3 工作终端 4 pip和virtuale ...

  9. python考试代码复制_笨办法学Python 习题 26: 恭喜你,现在可以考试了! 错误代码下载链接...

    你已经差不多完成这本书的前半部分了,不过后半部分才是更有趣的.你将学到逻辑,并通过条件判断实现有用的功能. 在你继续学习之前,你有一道试题要做.这道试题很难,因为它需要你修正别人写的代码.当你成为程序 ...

最新文章

  1. 如何制定恰当的信息安全策略
  2. 求助帖:android开发初期:为什么我在活动二设置的singInstance模式跑到活动三去了???
  3. linux驱动开发字符设备,linux驱动开发(三) 字符设备驱动框架
  4. matlab 林智仁,机器学习:林智仁libsvm 工具箱 在matlab下的应用总结
  5. SQLServer 2005 XML 在 T-SQL 查询中的典型应用[转]
  6. php文件手机怎么解压,linux 怎么解压文件
  7. python 内置模块 增加_模块的内置方法--Python提高班
  8. PMcaff写给大家的年终碎碎念 PMcaff | 记录
  9. SAP HR 常用事务代码
  10. java解析html jsoup_2020-06-02 jsoup java解析html
  11. GridView控件中的一些常见问题
  12. MyBatis配置详解
  13. 计算机二级真题期刊论文模板,最新一般期刊论文格式
  14. linux zip -e,在 Linux 上压缩文件:zip 命令的各种变体及用法
  15. ip addr命令解析
  16. count的几种写法
  17. SPSS连接mysql数据库详细操作教程
  18. maven 依赖公司另一项目中的对象,对象里的部分属性set值报错not found
  19. matlab矩阵写入csv
  20. 如何设置电信光猫?图解手把手教你(超级详细)

热门文章

  1. 【5G系列】RLC (Radio Link Control )协议详解
  2. oracle批量清除会话,oracle快速彻底清理kill会话
  3. Python 抓取淘宝联盟优惠券
  4. react事件 组件设计传参使用
  5. 【Kubernetes/docker】生成docker镜像推送到hub并在Kubernetes部署应用-20220407
  6. 什么叫做形态学图像处理_形态学图像处理
  7. 微信朋友圈装x代码_朋友圈生成器有哪些_微信朋友圈生成器大全_微信朋友圈装逼生成器下载_飞翔软件专题...
  8. eclipse上插入中文到mysql,但是navicat显示问号《网上很多方法都没用》,最终google到了精品
  9. sql group by 后取最后一条数据
  10. 关于OSPF的五种报文类型介绍、OSPF八种状态机变化与报文交互介绍。