【“笨办法”学Python】42.对象、类及从属关系——类即是对象
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.对象、类及从属关系——类即是对象相关推荐
- 【读书笔记】Python编程-基础知识和案例讲解,“笨办法”学Python 3_2020.02.15
[概述] --书名:"笨办法"学Python 3 --作者:泽德 A.肖 --日期:2020年02月15日 --大事件记录: 截至2月14日24时,据31个省(自治区.直辖市)和新 ...
- “笨办法”学Python 3基础篇-文件操作
"笨办法"学Python 3基础篇系列文章 "笨办法"学Python 3基础篇 第一部分-打印与输入 "笨办法"学Python 3基础篇 第 ...
- “笨办法”学Python 3基础篇 - 函数
"笨办法"学Python 3基础篇系列文章 "笨办法"学Python 3基础篇 第一部分-打印与输入 "笨办法"学Python 3基础篇 第 ...
- 《“笨办法”学Python(第3版)》——习题3 数字和数学计算
本节书摘来自异步社区<"笨办法"学Python(第3版)>一书中的习题3,作者[美]Zed A. Shaw,王巍巍 译,更多章节内容可以访问云栖社区"异步社区 ...
- 这本 Python 入门畅销书《“笨办法”学 Python 3》,不仅仅是一本书!
在我们学习任何一门语言的时候,我们都恨不得有一本书或者有一节视频就能让我们学会所有内容,或者购买的书籍里能包含练习题,带着练习学习的话会更好的理解内容,Python编程语言的话题热度目前来看一直居高不 ...
- “笨办法”学Python 3 ——练习42 Is-A, Has-A, 对象和类
练习42 对象和类的区别 类和对象之间的关系,就是is-a,has-a的关系形容.例如鱼,三文鱼是一种鱼(三文鱼is a fish),三文鱼有鳃(三文鱼has a 鳃). 总结:对象是类实例化后的产物 ...
- “笨办法”学Python笔记 Lesson35—45
一.作业内容 笨办法学 Python 习题35-45以及加分题. 二.作业代码: #习题35 分支和函数 from sys import exit def gold_room():print(&quo ...
- 笨方法学python第四版当当_“笨办法”学Python(第3版)
ZedShaw完善了这个堪称世上较好的Python学习系统.只要跟着学习,你就会和迄今为止数十万Zed教过的初学者一样获得成功. 在这本书中,你将通过完成52个精心设计的习题来学会Python.阅读这 ...
- 【“笨办法”学Python】20.函数和文件
20.函数和文件 文章目录 前言 一.Atom文本编辑器 二.运行Python程序 总结 前言 函数和文件在一起是如何一起协助发挥作用. 一.Atom文本编辑器 from sys import a ...
最新文章
- 员工培训案例分析答案_培训主管的技巧:培训教材问题解析、培训实施分析报告(附案例)...
- 【深度学习】6万字解决算法面试中的深度学习基础问题
- wxWidgets:wxCollapsiblePane类用法
- 调试U-Boot笔记(三)
- 根据数据库表gengxin实体类_ASP.NET开发实战——(十二)数据库之EF Migrations
- dataframe填充到指定的行数
- Java 学习路线之四个阶段
- ssis sql_SSIS OLE DB来源:SQL命令与表或视图
- [Java] 蓝桥杯 BASIC-3 基础练习 字母图形
- 杀鸡儆猴!苹果撤销Facebook的iOS企业证书
- 跟锦数学2017年01月
- Java中如何跳出多重for循环
- WiFi Explorer Mac版WiFi管理器常见问题解答
- 【C语言】标准内容介绍(C99)
- c语言abs和fabs的区别是什么?
- instant java,java.time.Instant.compareTo()方法
- 1T免费全能空间 注册即可开通
- 南阳OJ独木舟上的旅行
- 论文中参考文献的引用步骤
- 超详细的WMS仓储管理系统介绍——出库篇
热门文章
- 2021高性价比蓝牙耳机榜单,学生党最爱五款平价蓝牙耳机分享
- 回炉再造Css Layout
- linux命令行颜色,技术|在 Linux 命令行中自定义文本颜色
- 基于MATLAB燃料电池控制系统测试平台
- 机器学习方法:回归(三):最小角回归Least Angle Regression(LARS),forward stagewise selection
- 图像匹配—NCC算法,即归一化互相关匹配
- 《Electron 开发》 环境配置和Helloworld
- 了解RO、RW、ZI和.text .bss .data
- 5G技术发展的发展现状,未来发展有哪些关键点和趋势
- C++: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]