Python-练习 42. Is-A, Has-A, 对象和类

  • 鱼和三文鱼的区别是什么?
  • 代码怎么写
    • ex42.py
  • 关于 类名(object)
  • 问题

你必须理解类和对象的区别,这是一个很重要的概念。不过问题是,类和对象之间没有什么真正的区别。
它们在不同的时间点其实是同一种东西,我会用禅宗(Zen koan)来解释这一点:

鱼和三文鱼的区别是什么?

这个问题会让你困惑吗?坐下来认真想一分钟,我是说,鱼和三文鱼的确是有区别的,但是它们是同一种东西,对吧?三文鱼是鱼的一种,所以我说它们没什么区别。但是同时,三文鱼只是一种特定种类的鱼,它肯定不同于其他种类的鱼。三文鱼是三文鱼,而不是比目鱼。所以三文鱼和鱼是同一种东西,但是又有区别。

这个问题很令人困惑,因为大多数人不会这么去思考真实的东西,但是大家直觉上又能理解。你不需要去想鱼和三文鱼的具体区别是什么,因为你知道它们是相关的。你知道三文鱼是一种鱼,而且还有其他种类的鱼我们不用去理解。

让我们更进一步。假设你有一个水桶装了三条三文鱼,由于你是一个好人,你决定给它们三个起个名字,分别叫 Frank、Joe 和Mary。现在想想这个问题:

Mary 和三文鱼的区别是什么?

这也是一个很奇怪的问题。但是它好像比鱼和三文鱼的问题要简单一点。你知道 Mary 是一条三文鱼,所以她真的不一样,她只是三文鱼的一个“实例”。 Joe 和 Frank 也是三文鱼的实例。当我说“实例”的时候我指的是什么? 我是指它们由其他三文鱼创造而来,但是现在代表了一个具有三文鱼属性的真实存在的东西。

现在回到这个让人伤脑筋的问题:鱼是一个类,三文鱼也是一个类,而 Mary 是一个对象。想几秒钟,让我们拆开来讲,看你是否理解了。
鱼是一个类,意味着它不是一个真正的东西,而是一个我们用来给具有相似属性的实例归类的词,理解了吗?比如有鳍,有鳃,生活在水里,好吧,那可能是鱼。
可能会有位 Ph.D. 跑过来说,“不,年轻人,这鱼其实是大西洋鲑,人们喜欢叫它三文鱼。”这位教授只是更详细地澄清了一下,同时创建了一个叫做“三文鱼”的新类,它有一些更特别的属性。鼻子很长,肉呈淡红色, 体型大,生活在淡水里,很好吃?那可能是三文鱼。
最后,一位厨师跑过来告诉这位 Ph.D.,“不,你看这条三文鱼,我叫她 Mary,我等会儿要用她做一道很好吃的生鱼片。” 现在你有了一个叫做 Mary 的三文鱼实例(也是鱼的实例),她是真实存在的,能填饱你的肚子。她已经变成了一个对象。

现在你明白了:Mary 是一种三文鱼,三文鱼是一种鱼。对象一种类,类是另一种类。

代码怎么写

这是个很奇怪的概念,不过说实话,你只用在你创建新类和使用类的时候才用担心它。我会教你两个识别一个东西是类还是对象的小技巧。

首先,你需要学习两个信号词:“is-a”(是...)和“has-a”(有...)。
当你表达对象和类的相互关系时,你用“is-a”。当你指对象和类相互引用时,你用“has-a”。

现在,过一遍这些代码,然后把 ##?? 替换为注释,说明下一行代表了 is-a 还是 has-a 的关系,以及是什么关系。我在代码最开始已经列出了一些示例,你需要完成剩余的部分。
记住,is-a 指的是鱼和三文鱼之间的关系,has-a 指的是三文鱼和鳃的关系。

ex42.py

## Animal is-a object (yes, sort of confusing) look at the extra credit(附加练习)
class Animal(object):pass## Dog is-an Animal
class Dog(Animal):def __init__(self, name):##self.name = name## Cat is-a Animal
class Cat(Animal):def __init__(self, name):##self.name = name## person is-a object
class Person(object):def __init__(self, name):##self.name = name## Person has-a pet of some kindself.pet = None## Employee is-a Person
class Employee(Person):def __init__(self, name, salary):## ?? hmm what is this strange magic?super(Employee, self).__init__(name)## Employee has-a salaryself.salary = salary## Fish is-a object
class Fish(object):pass## Salmon is-a Fish
class Salmon(Fish):pass## Halibut is-a Fish
class Halibut(Fish):pass## rover is-a Dog
rover = Dog("Rover")## satan is-a Cat
satan = Cat("Satan")## mary is-a Person
mary = Person("Mary")## mary has-a pet,satan is-a Cat
mary.pet = satan## frank ia-a Employee
frank = Employee("Frank", 120000)## frank has a pet,rover is-a Dog
frank.pet = rover## flipper is-a fish
flipper = Fish()## crouse is-a Salmon
crouse = Salmon()## harry is-a Halibut
harry = Halibut()'''-----------------------------------------------------------------------------''''''
1. 研究一下为什么 Python 添加了这个奇怪的叫做 object 的类,它究竟有什么含义呢?
Python中一切皆对象,创建的类皆以object为基类(父类),默认继承继承基类的属性和方法2. 有没有可能把一个类当作对象来使用呢?
当一个类A是继承与类B时,则A对于B来说就是对象,就是把A当做对象来使用3. 在习题中为 animals、fish、还有 people 添加一些函数,让它们做一些事情。看看当函数在Animal这样的“基类(base class)”里和在 Dog 里有什么区别。4. 找找别人的代码,弄明白里面的 is-a 和 has-a 的关系。5. 使用列表和字典创建一些新的一对多的“has-many”的关系。6. 你认为会有一种“has-many”的关系吗?阅读一下关于“多重继承(multiple inheritance)”的
资料,然后尽量避免这种用法。'''

关于 类名(object)

我一直强迫你使用 类名(object) ,但一直没跟你解释为什么要这样用。刚才你已经学了类和对象的区别,现在我就可以告诉你原因了。因为如果我早告诉你的话,你可能会晕掉,也就学不会这门技术了。

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

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

的确如此。一个词的不同就让这个概念变得更难理解,让我不得不现在才讲给你。现在你可以试着去理解“一个是对象的类”这个概念了,如果你感兴趣的话。不过我还是建议你别去理解了,干脆完全忘记旧格式和新格式类的区别吧,就假设 Python 的类永远都要求你加上 (object) 好了,你的脑力要留着思考更重要的问题。

问题

这些 ## ?? 注释是做什么的?
这些是一些注释的填空,你需要在那里填上正确的 “is-a”或“has-a” 的概念。把这个练习再读一遍,看看其他的注释,你就明白我的意思了。

self.pet = None 有什么意义?
这样确保 self.pet 这个类的属性被设为默认的 None。

super(Employee, self).init(name) 是干什么的?
这是你运行父类的 init 方法的一种可靠方式。搜索一下 “python3.6 super”,读读那些对你有利有弊的各种建议。

super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
MRO 就是类的方法解析顺序表, 其实也就是继承父类方法时的顺序表。
# super(FooChild,self) 首先找到 FooChild 的父类(就是类 FooParent),然后把类 FooChild 的对象转换为类 FooParent 的对象
super(FooChild,self).__init__()

python子类调用父类成员有2种方法,分别是普通方法和super方法

假设Base是基类

class Base(object):def __init__(self):print “Base init”

则普通方法如下

class Leaf(Base):def __init__(self):Base.__init__(self)print “Leaf init”

super方法如下

class Leaf(Base):def __init__(self):super(Leaf, self).__init__()print “Leaf init”

在上面的简单场景下,两种方法的效果一致:

leaf = Leaf()
Base init
Leaf init

Python-练习 42. Is-A, Has-A, 对象和类相关推荐

  1. 疯狂Python讲义学习笔记(含习题)之 类和对象

    Python支持面向对象的三大特征:封装.继承和多态. 一.类和对象 可以把类当成一种自定义类型,可以使用类来定义变量,也可以使用类来创建对象. (一)定义类 类是某一批对象的抽象,可以把类理解成某种 ...

  2. 【“笨办法”学Python】42.对象、类及从属关系——类即是对象

    42.对象.类及从属关系--类即是对象 文章目录 前言 一.鱼和泥鳅有什么区别? 二.小丽和泥鳅有什么区别? 三.代码测试 四.super(Employee, self).\_\_init\_\_(n ...

  3. 笔记35 笨办法学python练习42对象、类、从属关系和部件关系

    笔记35 笨办法学python练习42对象.类.从属关系和部件关系 一.类.对象与从属关系 这个练习是一个有点哲学意味的练习,讨论对象和类的关系,也就是从属关系.对象不就是下属于某个类的子类,或者个体 ...

  4. “笨办法”学Python 3 ——练习42 Is-A, Has-A, 对象和类

    练习42 对象和类的区别 类和对象之间的关系,就是is-a,has-a的关系形容.例如鱼,三文鱼是一种鱼(三文鱼is a fish),三文鱼有鳃(三文鱼has a 鳃). 总结:对象是类实例化后的产物 ...

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

    有一个重要的概念你需要弄明白,那就是"类 (class)" 和"对象 (object)" 的区别.问题在于, class 和object 并没有真正的不同.它们 ...

  6. python中简述对象和类的关系_Python笔记-习题42 对象、类及从属关系

    1.研究一下为什么Python添加了这个奇怪的叫做object的类,它究竟有什么含义呢? A:Python中一切皆对象,创建的类皆以object为基类(父类),默认继承继承基类的属性和方法 Pytho ...

  7. 《笨方法学 Python 3》42.对象、类及从属关系

    有个重要的概念必须弄明白,那就是'类'和'对象'的区别. 原文中花费了大量语段来描述,我就按个人理解简单的归纳一下,可能不对,如有误,请指出: 1.类:就是具有相同属性的方法的集合,此处的方法就是指的 ...

  8. 笨方法学Python 习题 42: 对象、类、以及从属关系

    有一个重要的概念你需要弄明白,那就是"类(class)"和"对象(object)"的区别.问题在于,class 和 object 并没有真正的不同.它们其实是同 ...

  9. python加上子类的特性_Python--面向对象三大特性

    一.面向对象三大特性 什么是类的继承? 类的继承跟现实生活中的父.子.孙子.重孙子.继承关系一样,父类又称为基类. python中类的继承分为:单继承和多继承 1.继承 1 class ParentC ...

  10. python禅语_42:对象、类、以及从属关系

    # 练习42.对象.类.以及从属关系 有一个重要的概念你需要弄明白,那就是"类(class)"和"对象(object)"的区别.问题在于,class 和 obj ...

最新文章

  1. STL学习系列九:Map和multimap容器
  2. CheckM——国家微生物科学数据中心云工具
  3. 2020年Spring Cloud最后一个大版本发布!
  4. spring 学习—spring的相关概念(01)
  5. cambridge mphil in management result
  6. 机器学习面试题(part3)
  7. 前端学习(1348):用户的增删改查操作5修改
  8. mybatis调用oracle过程,使用MyBatis调用Oracle存储过程
  9. Dev C++详细配置
  10. php链接文字变色,Linux_不断变色的文字,不断变色的文字效果,漂亮而 - phpStudy...
  11. 基于JAVA+SpringMVC+Mybatis+MYSQL的员工事物管理系统
  12. 超级强大的鼠标手势工具
  13. 【Mava】一个分布式多智能体强化学习研究框架
  14. 使用高通解析ramdump tool 遇到的问题
  15. 强制删除文件处理程序
  16. Unity全局音量控制
  17. 脉冲经过高通和低通滤波器后的波形
  18. 小技巧:不显示打印对话框直接打印网页到打印机
  19. Juc_并发编程目录
  20. 为什么去开发一个MLSQL

热门文章

  1. 加入企业黄页有什么好处?
  2. VMware VCP认证常见问答题
  3. 聊聊Hibernate和Mybatis的区别
  4. 那些清华北大随便挑的高考状元们,后来都过上了怎样的生活?
  5. word文档的生成以及echarts图片的插入
  6. Google浏览器打开新页面会覆盖当前页面的问题(打开新页面)
  7. 一文了解加密游戏illuvium新玩法:探索神兽世界
  8. python公开课乐博学院_当我学完 Python ,我学会了些什么【乐搏TestPRO】
  9. 记一道MISC图片题(拖延癌晚期)
  10. Xinetd服务的安装与配置【转载】