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

鱼和三文鱼有什么区别?

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

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

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

Mary和三文鱼有什么区别?

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

所以我们的思维方式是(你可能会有点不习惯):鱼是一个“类(class)”,三文鱼是一个“类(class)”,而Mary是一个“对象(object)”。仔细想想,然后我再一点一点慢慢解释给你。

鱼是一个“类”,表示它不是一个真正的东西,而是一个用来描述具有同类属性的实例的概括性词汇。 你有鳍?你有鳔?你住在水里?好吧那你就是一条鱼。

后来河蟹养殖专家路过,看到你的水桶,于是告诉你:“小伙子,你这些鱼是三文鱼。” 并且专家还定义了一个新的叫做“三文鱼”的“类”,而这个“类”又有它特定的属性。长鼻子?浅红色的肉?生活在海洋里?吃起来味道还可以?那你就是一条三文鱼。

最后一个厨师过来了,他跟专家说:“非也非也,你看到的是三文鱼,我看到的是Mary,而且我要把Mary和剁椒配一起做一道小菜。”于是你就有了一只叫做Mary的三文鱼的“实例(instance)”(三文鱼也是鱼的一个“实例”),并且你使用了它,这样它就是一个“对象(object)”。

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

写成代码是什么样子

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

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

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

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

## Animal is-a object (yes, sort of confusing) look at the extra credit

class Animal(object):

pass

## ??

class Dog(Animal):

def __init__(self, name):

## ??

self.name = name

## ??

class Cat(Animal):

def __init__(self, name):

## ??

self.name = name

## ??

class Person(object):

def __init__(self, name):

## ??

self.name = name

## Person has-a pet of some kind

self.pet = None

## ??

class Employee(Person):

def __init__(self, name, salary):

## ?? hmm what is this strange magic?

super(Employee, self).__init__(name)

## ??

self.salary = salary

## ??

class Fish(object):

pass

## ??

class Salmon(Fish):

pass

## ??

class Halibut(Fish):

pass

## rover is-a Dog

rover = Dog("Rover")

## ??

satan = Cat("Satan")

## ??

mary = Person("Mary")

## ??

mary.pet = satan

## ??

frank = Employee("Frank", 120000)

## ??

frank.pet = rover

## ??

flipper = Fish()

## ??

crouse = Salmon()

## ??

harry = Halibut()

关于 class Name(object)

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

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

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

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

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

附加题

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

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

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

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

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

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

常见问题

Q: 这些注释符## ??是干什么的?

这些是你需要完成的“填空”,你需要填上 "is-a"或者 "has-a"。再读一遍本节练习,看看其他的注释,弄明白我再说什么。

Q: self.pet = None是什么意思?

确保给self.pet设置了一个默认值None

Q: super(Employee, self).__init__(name)实现了什么?

这是用来执行父类的__init__方法的,上网搜索一下“python super”相关文档,阅读文档的各种建议。

python从属关系编号_42:对象、类、以及从属关系相关推荐

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

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

  2. 笨方法学Python—ex42:对象、类及从属关系

    对象.类及从属关系 "类"(class)和"对象"(object)的区别: 两者并没有真正的不同,只是在不同时间名字不同罢了. 1) 鱼和泥鳅有什么区别呢? 两 ...

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

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

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

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

  5. python定义一个人类_Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的 ...

  6. Python基础(六)--类与对象

    目录 Python基础(六)--类与对象 1 类与对象的基本概念 1.1 什么是对象 1.2 什么是类 1.3 类与对象的关系 2 定义与初始化 2.1 类的定义 2.2 对象的初始化 2.3 动态增 ...

  7. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感...

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  8. Python使用---面向对象OOP(类和对象)--完善中

    来源于此 目录 1.面向对象(OOP)基本概念 1.1 过程和函数(科普) 1.2 面相过程 和 面相对象 基本概念 2 类和对象 2.1 类 2.2 对象 2.3 类和对象的关系 3 类的设计 4 ...

  9. Python入门基础(6)--面向对象/类和对象/魔术方法

    面向对象基本概述 面向对象(Object Oriented Programming,OOP)编程:扩展性更强.可读性更好.面向对象的编程将数据和操作数据封装到对象中,组织代码和数据的方式更接近人的思维 ...

最新文章

  1. 文件读取getline与fscanf_s
  2. 用户系统-开放平台的一些思考
  3. System center 2012 R2 实战十、妙用SCO+SCOM实现声音告警
  4. Android中实现震动的方法
  5. Docker与虚拟机
  6. 模块式开发 java_Java9系列第8篇-Module模块化编程
  7. 一个控制器怎么转发到另外一个控制器_楼宇自动化系统(BAS),DDC,一个最核心的控制器...
  8. Python getattr() 函数==>获取一个对象的属性值
  9. Shell脚本修改Nginx upstream配置文件
  10. 修改服务器资产信息,CMDB服务器管理系统【s5day90】:创建资产更新服务器硬盘信息...
  11. python函数和代码复用思维导图_Python语言程序---代码复用与函数递归(二)
  12. vscode安卓html扩展,vscode扩展信息.html
  13. 【海康威视】WPF客户端二次开发:【1】监控视频画面预览(SDK初始化、设备登录、监控画面预览)
  14. 斯坦福机器学习教程学习笔记之1
  15. 如何在Linux系统上装jdk1.8以及环境配置的方法步骤
  16. 玩平衡小车系列—TB6612FNG与直流电机控制教程
  17. 用python制作二维码_使用python制作二维码
  18. CSS中左上朝向三角形(Top-Left Triangle)的几种制作方式
  19. 23 种设计模式的通俗解释,虽然有点污,但是秒懂
  20. 美国华盛顿州立大学计算机排名,华盛顿州立大学计算机科学computer science专业排名第251~300名(2020THE泰晤士高等教育世界大学排名)...

热门文章

  1. adb命令:WIFI连接设备
  2. tkinter窗口美化功能介绍 第一章 内部美化功能
  3. Scratch(三):跳一跳
  4. 最新蓝奏云软件库系统源码分享下载+非WebView
  5. 白噪声检验python_python 加一个白噪声跟老齐学Python之Python安装
  6. 第十五届全国大学生智能车全国总决赛获奖信息-西部赛区
  7. w10用计算机卸载,win10系统内置应用卸载方法
  8. JavaScript奇淫技巧:隐写术
  9. 认沽期权长短仓应用法
  10. jtag的emu0与emu1_谁特么告诉你EMU就是1分钱就能赚75美元?