42.对象、类及从属关系——类即是对象


文章目录

  • 前言
  • 一、鱼和泥鳅有什么区别?
  • 二、小丽和泥鳅有什么区别?
  • 三、代码测试
  • 四、super(Employee, self).\_\_init\_\_(name)
  • 五、关于 class Name(object)
  • 总结

前言

  “类(class)”和“对象(object)”的区别。


一、鱼和泥鳅有什么区别?

  这个问题会让人有点晕,它意思是说,鱼和泥鳅是不一样,不过它们其实也是一样的!泥鳅是鱼的一种,所以说没什么不同,不过泥鳅又有些特别,它和别的种类的鱼的确不一样,比如泥鳅和黄鳝就不一样。所以泥鳅和鱼既相同又不同。
  这个问题让人晕的原因是大部分人不会这样去思考问题,其实每个人都懂这一点,你无须去思考鱼和泥鳅的区别,因为你知道它们之间的关系。你知道泥鳅是鱼的一种,而且鱼还有别的种类,根本就没必要去思考这类问题。
  更进一步的,假设有一只水桶,里边有三条泥鳅。假设你的好人卡多到没地方用,于是你给它们分别取名叫小方,小乔,小丽。现在想想这个问题:


二、小丽和泥鳅有什么区别?

  这个问题一样的奇怪,但比起鱼和泥鳅的问题来还好点。要知道小丽是一条泥鳅,所以它并没什么不同,它只是泥鳅的一个“实例(instance)”。小方和小乔一样也是泥鳅的实例。它们的意思是说,它们是由泥鳅创建出来的,而且代表着和泥鳅一样的属性。
  所以需要这样思考:鱼是一个“类(class)”,泥鳅是一个“类(class)”,而小丽是一个“对象(object)”。
  鱼是一个“类”,表示它不是一个真正的东西,而是一个用来描述具有同类属性的实例的概括性词汇。 有鳍?有鳔?住在水里?那它就是一条鱼。
  后来水产博士路过,看到水桶里的泥鳅:“这是鲤形目鳅科的泥鳅。” 专家一出,真相即现。并且专家还定义了一个新的叫做“泥鳅”的“类”,而这个“类”又有它特定的属性。细长条?有胡须?爱钻泥巴?吃起来味道还可以?那它就是一条泥鳅。
  最后大厨路过,他跟水产博士说:“非也非也,你看到那条泥鳅,我叫它小丽,我要把小丽和剁椒配一起做一道小菜。”于是,就有了一只叫做小丽的泥鳅的“实例(instance)”(泥鳅也是鱼的一个“实例”),并且你使用了它(把它塞到你的胃里了),这样它就是一个“对象(object)”。
  这会你应该了解了:小丽是泥鳅的成员,而泥鳅又是鱼的成员。这里的关系式:对象属于某个类,而某个类又属于另一个类。


三、代码测试

  这个概念有点绕人,不过实话说,只要在创建和使用class的时候操心一下就可以了。
  两个区分Class 和Object 的小技巧:
(1) 首先针对类和对象,需要学会两个说法,“is-a(是什么)”和“has-a(有什么)”。
(2) “是什么”要用在谈论“两者以类的关系互相关联”的时候,而“有什么”要用在“两者无共同点,仅是互为参照”的时候。
  记住,“是什么”指的是鱼和泥鳅的关系,而“有什么”指的是泥鳅和鳃的关系。

# Animal is-a object (yes, sort of confusing) look at the extra credit
class Animal(object):pass# Dog is-a Animal
class Dog(Animal):def __init__(self, name):# Dog has-a nameprint ("Dog class init")self.name = name# Cat is-a Animal
class Cat(Animal):def __init__(self, name):# Cat has-a nameprint ("Cat class init")self.name = name# Person is-a object
class Person(object):def __init__(self, name):# Person has-a nameprint ("Person class init")print ("person super")self.name = name# Person has-a pet of some kindself.pet = None# Employee is-a Person
class Employee(Person):def __init__(self, name, salary):# Employee has-a name# 子类调用父类时候使用 super(子类名, self).方法名(参数)# 子类 Employee 要调用父类 Person 的 name ,因为这里本来没有 name 这个东西print ("Employee class init")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 named satan
mary.pet = satan# frank is-a Employee ,frank has-a salary = 120000
frank = Employee("Frank", 120000)# frank has-a pet named rover
frank.pet = rover# 把flipper设为类Fish的一个实例
flipper = Fish()# Salmon三文鱼,把crouse设为Salmon的一个实例
crouse = Salmon()# Halibut大比目鱼,把harry设为Halibut的一个实例
harry = Halibut()

  在Window上键入Python就可以看到结果。

python ex42.py


  从整个计算机科学的角度来说,对象是对客观事物的抽象,类是对对象的抽象,大类是对小类的抽象。类和对象都是一种抽象的数据类型。
  对象(Object):是指在应用问题中出现的各种实体、事件和规格说明等,它是由一组属性和在这组值上的一组服务(这里的服务指的是操作,就是我们写在类里的函数所提供的功能)构成的,其中属性值确定了对象的状态。
  类(Class):把具有相同属性和服务的对象归到同一类,而把一个类中的的每一个对象称为该类的一个实例(Instance),它们具有相同的服务。
  继承:面向对象方法最有特色的方面。
  继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化、定制化。

四、super(Employee, self).__init__(name)

  ex42.py中的super(Employee, self).__init__(name)其实简单理解就是子类把父类的.__init__()放到自己的.__init__()当中,这样子类就有了父类的.__init__()的那些东西。
  代码中,Employee类继承Person,super(Employee, self).__init__(name)就是对继承自父类Person的属性进行初始化。而且是用Person的初始化方法来初始化继承的属性。
  也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
举个例子帮助大家理解:

class Person(object):def __init__(self,name,gender,age):self.name = nameself.gender = genderself.age = ageclass Student(Person):def __init__(self,name,gender,age,school,score):super(Student,self).__init__(name,gender,age)self.school = schoolself.score = scores = Student('Alice','female',18,'Middle school',87)print(s.name)
print(s.gender)
print(s.age)
print(s.school)
print(s.score)

  运行后可以看到结果:

五、关于 class Name(object)

  使用 class Name(object) 真正的原因是在Python早期,它对于class的定义在很多方面都是严重有问题的。当他们承认这一点的时候已经太迟了,所以逼不得已,他们需要支持这种有问题的 class。为了解决已有的问题,他们需要引入一种“新类”,这样的话“旧类”还能继续使用,而你也有一个新的正确的类可以使用了。
  这就用到了“类即是对象”的概念。他们决定用小写的“object”这个词作为一个类,让你在创建新类时从它继承下来。一个类从另一个类继承,而后者虽然是个类,但名字却叫“object”!不过在定义类的时候,别忘记要从object继承就好了。


总结

  以上内容介绍了Python的对象、类及从属关系,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

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

  1. 【读书笔记】Python编程-基础知识和案例讲解,“笨办法”学Python 3_2020.02.15

    [概述] --书名:"笨办法"学Python 3 --作者:泽德 A.肖 --日期:2020年02月15日 --大事件记录: 截至2月14日24时,据31个省(自治区.直辖市)和新 ...

  2. “笨办法”学Python 3基础篇-文件操作

    "笨办法"学Python 3基础篇系列文章 "笨办法"学Python 3基础篇 第一部分-打印与输入 "笨办法"学Python 3基础篇 第 ...

  3. “笨办法”学Python 3基础篇 - 函数

    "笨办法"学Python 3基础篇系列文章 "笨办法"学Python 3基础篇 第一部分-打印与输入 "笨办法"学Python 3基础篇 第 ...

  4. 《“笨办法”学Python(第3版)》——习题3 数字和数学计算

    本节书摘来自异步社区<"笨办法"学Python(第3版)>一书中的习题3,作者[美]Zed A. Shaw,王巍巍 译,更多章节内容可以访问云栖社区"异步社区 ...

  5. 这本 Python 入门畅销书《“笨办法”学 Python 3》,不仅仅是一本书!

    在我们学习任何一门语言的时候,我们都恨不得有一本书或者有一节视频就能让我们学会所有内容,或者购买的书籍里能包含练习题,带着练习学习的话会更好的理解内容,Python编程语言的话题热度目前来看一直居高不 ...

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

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

  7. “笨办法”学Python笔记 Lesson35—45

    一.作业内容 笨办法学 Python 习题35-45以及加分题. 二.作业代码: #习题35 分支和函数 from sys import exit def gold_room():print(&quo ...

  8. 笨方法学python第四版当当_“笨办法”学Python(第3版)

    ZedShaw完善了这个堪称世上较好的Python学习系统.只要跟着学习,你就会和迄今为止数十万Zed教过的初学者一样获得成功. 在这本书中,你将通过完成52个精心设计的习题来学会Python.阅读这 ...

  9. 【“笨办法”学Python】20.函数和文件

    20.函数和文件 文章目录 前言 一.Atom文本编辑器 二.运行Python程序 总结 前言   函数和文件在一起是如何一起协助发挥作用. 一.Atom文本编辑器 from sys import a ...

最新文章

  1. 员工培训案例分析答案_培训主管的技巧:培训教材问题解析、培训实施分析报告(附案例)...
  2. 【深度学习】6万字解决算法面试中的深度学习基础问题
  3. wxWidgets:wxCollapsiblePane类用法
  4. 调试U-Boot笔记(三)
  5. 根据数据库表gengxin实体类_ASP.NET开发实战——(十二)数据库之EF Migrations
  6. dataframe填充到指定的行数
  7. Java 学习路线之四个阶段
  8. ssis sql_SSIS OLE DB来源:SQL命令与表或视图
  9. [Java] 蓝桥杯 BASIC-3 基础练习 字母图形
  10. 杀鸡儆猴!苹果撤销Facebook的iOS企业证书
  11. 跟锦数学2017年01月
  12. Java中如何跳出多重for循环
  13. WiFi Explorer Mac版WiFi管理器常见问题解答
  14. 【C语言】标准内容介绍(C99)
  15. c语言abs和fabs的区别是什么?
  16. instant java,java.time.Instant.compareTo()方法
  17. 1T免费全能空间 注册即可开通
  18. 南阳OJ独木舟上的旅行
  19. 论文中参考文献的引用步骤
  20. 超详细的WMS仓储管理系统介绍——出库篇

热门文章

  1. 2021高性价比蓝牙耳机榜单,学生党最爱五款平价蓝牙耳机分享
  2. 回炉再造Css Layout
  3. linux命令行颜色,技术|在 Linux 命令行中自定义文本颜色
  4. 基于MATLAB燃料电池控制系统测试平台
  5. 机器学习方法:回归(三):最小角回归Least Angle Regression(LARS),forward stagewise selection
  6. 图像匹配—NCC算法,即归一化互相关匹配
  7. 《Electron 开发》 环境配置和Helloworld
  8. 了解RO、RW、ZI和.text .bss .data
  9. 5G技术发展的发展现状,未来发展有哪些关键点和趋势
  10. C++: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]