Python-练习 40. 模块、类和对象

  • 模块就像字典
    • ex40a.py
    • mystuff.py
    • mystuff.py
    • ex40b.py
  • 40.1.1 类就像模块
    • ex40c.py
  • 40.1.2 对象就像导入(import)
    • ex40c.py
  • 40.1.3 获取数据
  • 40.1.4 第一个类的例子
    • 运行结果
    • 问题

Python 是一门“面向对象的编程语言”(Object Oriented Programming)。

这是指 Python 中有一个叫做类(class)的结构,能够让你用一种特定的方式结构化你的软件。通过使用类,你可以让你的程序保持连贯性,使用起来更清晰。至少理论上是这样。

现在要学习一些面向对象编程的初级知识——类和对象,就用已经学过的列表和模块来解释。

面向对象编程(OOP)这个说法听起来有点抽象,但是你必须试着去理解它,老老实实敲代码,我会在下一个练习中深入讲解。

模块就像字典

你知道一个字典是如何被创建、使用以及将一个东西映射到另一个东西上。也就是说,如果你有一个字
典的键是“apple”,你可以这样做来获取它:

ex40a.py

mystuff = {'apple': "I AM APPLES!"}
print(mystuff['apple'])# get apple from dict

记住这种 “get X from Y” 的方式。现在想想模块。你已经用过一些了,应该知道它们是:

  1. 一个包含函数和变量的 Python 文件 …
  2. 你导入这个文件。
  3. 你用 . 运算符来获取这个模块中的函数或变量。

假设我有一个名为 mystuff.py 的模块,我在其中放了一个叫做 apple 的函数。以下是 mystuff.py 这个模块的内容:

mystuff.py

def apple():print("I AM APPLES!")

一旦有了这些代码,我就可以通过导入来使用这个模块,然后获取其中的 apple 函数:

import mystuffmystuff.apple()# get apple from module

我还可以创建一个名为 tangerine 的变量:

mystuff.py

def apple():print("I AM APPLES!")# this is just a variable
tangerine = "Living reflenction of a dream"

我可以用同样的方式来访问这个变量:

ex40b.py

import mystuffmystuff.apple()# get apple from module
print(mystuff.tangerine)# same thing, it's just a variable

说回字典,你应该已经意识到了上述模块的使用与字典非常类似,但是语法有些不一样,让我们对比一下:

1.mystuff['apple'] # get apple from dict
2.mystuff.apple() # get apple from the module
3.mystuff.tangerine # same thing, it's just a variable

这表明 Python 中有一个非常通用的模式:

  1. 用一个键=值(key=value)形式的容器。
  2. 通过键的名称来从中获取内容。
    在字典中,键是一个字符串,语法是: [key] 。而在模块中,键是一个识别符,语法是 .key ,除此之外它们几乎是同一种东西。

40.1.1 类就像模块

你可以把模块想象成一个可以储存 Python 代码并且可以用 . 运算符获取它的特定字典。Python 还有一种类似功能的结构叫做类(class)。类是一种整合一组函数和数据的方式,它将函数和数据放在一个容器内以便你能通过 . 运算符进行访问。
如果我要创建一个类似 mystuff 模块的类,我会这么做:

ex40c.py

Class MyStuff(object):def _init_(self):#初始化self.tangerine = "And now a thousand years between"def apple(self):print("I AM CLASSY APPLES!")

和模块比起来这看起来有些复杂,而且不同点很多,但是你应该能够看出来它就像一个小型的 MyStuff模块,包含了一个 apple() 函数。可能让你困惑的是这个 init() 函数以及设置实例变量使用的self.tangerine 。

使用类而不用模块的原因有:你可以用这个 MyStuff 类复制很多个,如果你想的话,一次几百万个都行,并且它们之间不会相互干涉。但是当你导入一个模块,对整个程序来说只有一个,除非你用一些黑客技术。

不过在你理解这些之前,你需要先知道什么是“对象”,以及如何和 MyStuff 类一起使用,就像你使用mystuff.py 模块一样。

40.1.2 对象就像导入(import)

如果说类是一个小型模块,那么应该要有一个概念和 import 类似。这个概念就叫做“实例化”(instantiate),你可以理解为它是“创造”(create)一词的华而不实、令人讨厌、自以为是的说法。当你实例化一个类,你得到的东西就叫做对象。

你通过像函数一样调用这个类来实例化(创造)一个对象,就像这样:

ex40c.py

Class MyStuff(object):def _init_(self):#初始化self.tangerine = "And now a thousand years between"def apple(self):print("I AM CLASSY APPLES!")thing = MyStuff()
thing.apple()
print(thing.tangerine)

第一行就是实例化操作,它很像调用一个函数。不过,Python 在屏幕后面为你协调了一系列事件,我会为你过一下这些步骤:

  1. Python 找了一下 MyStuff() 然后发现它是你定义的一个类。
  2. Python 创建了一个空对象,以及你在类中用 def 指定的所有函数。
  3. 然后 Python 会看你会不会用一个神奇的 init 函数,来初始化你新创建的空对象。
  4. 在 MyStuff 类的 init 函数中,还有一个变量 self ,这是 Python 为我创建的空对象,我可以在里面设置变量,就像在模块、字典或其他对象里一样。
  5. 在这个例子中,我设置了一个 self.tangerine 变量,并给它赋了一句歌词,然后我就完成了对这个对象的初始化。
  6. 现在 Python 可以把这个新打造的对象赋给 thing 变量来供我使用。

这就是当你像调用函数一样调用一个类的时候,Python 所做的类似于“小型导入”的基本过程。记住,这里不是把这个类给你,而是以这个类为蓝本,创建一个同类型的副本。

你要记住,我告诉你的是一些不太准确的概念,主要是希望能基于已经学过的模块来以帮助你理解类。
但事实上,类和对象会在这一点上与模块产生偏离。如果我更坦诚一点,我应该这样说:
• 类就像创建新的小型模块的蓝本或定义。
• 实例化是你如何创建这些小型模块并同时导入它们。“实例化”的意思就是从类那里创建一个对象。
• 你所创建的小型模块的结果被称作对象,然后你把它赋给一个变量来使用。

至此,对象和模块开始变得截然不同,以上只能是帮助你理解类和对象的一个桥梁。

40.1.3 获取数据

我现在有三种从获取数据的方式:

# dict style
mystuff['apples']# module style
mystuff.apples()
print(mystuff.tangerine)# class style
thing = MyStuff()
thing.apples()
print(thing.tangerine)

40.1.4 第一个类的例子

你应该已经注意到了这三种键值对(键=值)容器的相似之处,并且可能还有一大堆问题要问。先别着急问,因为下个练习会向你硬性灌输一些“面向对象的术语”。在这个练习中,我只希望你敲敲代码,让程序正常运行,这样你能在继续学习之前获得一些切身体验。

class Song(object):def __init__(self, lyrics):self.lyrics = lyricsdef sing_me_a_song(self):for line in self.lyrics:print(line)happy_bday = Song(["Happy birthday to you","I don't want to get sued","So I'll stop right there"])bulls_on_parade = Song(["They rally around the family","With pockets full of shells"])hair_like_snow = Song(["你发如雪 凄美了离别","我焚香感动了谁","邀明月 让回忆皎洁","爱在月光下完美"])happy_bday.sing_me_a_song()bulls_on_parade.sing_me_a_song()hair_like_snow.sing_me_a_song()
'''-----------------------------------------------------------------------------''''''
1. 用这个方法再写一些歌,确保你明白你正在用字符列表来传歌词。2. 把歌词放在一个单独的变量里,然后把这个变量放在类里面来使用。3. 如果你能搞定这些,可以用它来做更多的事情。要是你现在没什么想法也别担心,就试试看会发生
什么。然后把它们掰开、揉碎、反复研究。4. 在网上搜搜“面向对象的编程”,然后填满你的大脑。别担心你看不懂,因为几乎一半的东西我也看
不懂。'''

运行结果

问题

为什么我在类下面用 init 函数或者其他函数的时候要用 self ?
如果你不用 self ,那么像cheese = ‘Frank’ 这样的代码就会很含糊,计算机不知道你是指实例的 cheese 属性还是 一个叫做
cheese 的局部变量。而用 self.cheese = ‘Frank’ 的话就会很清晰,你是指实例的属性 self.cheese

Python-练习 40. 模块、类和对象相关推荐

  1. Python学习笔记 (类与对象)

    Python学习笔记 (类与对象) 1.类与对象 面向对象编程语言类: 一个模板, (人类)-是一个抽象的, 没有实体的对象: (eg: 张三, 李四) 属性: (表示这类东西的特征, 眼睛, 嘴巴, ...

  2. python用于导入模块或模块中的对象_在 Python 中导入模块中的对象有哪几种方式? (5.0分)_学小易找答案...

    [判断题]尽管可以使用 import 语句一次导入任意多个标准库或扩展库,但是仍建议每次只导入一个标准库或扩展库. (2.0分) [填空题]表达式 int(str(34)) == 34 的值为 ___ ...

  3. Python学习-基础篇5 常用模块+类与对象(1)

     #random模块 1 import random2 3 print(random.random())#(0,1)----float 大于0且小于1之间的小数4 5 print(random.ran ...

  4. python 参数类型的多态_【Python】面向对象:类与对象\封装\继承\多态

    六.Python面向对象--类与对象\封装\继承\多态 1.什么是面向对象编程 1.1 程序设计的范式:程序可控,易于理解 1.2 抽象并建立对象模型 1.3 程序是不同对象相互调用的逻辑.每个对象在 ...

  5. python学习之【类和对象】

    前言 五一快乐! 上一篇文章python学习--[第八弹]中,给大家介绍了python中的函数,这篇文章接着学习python中的类和对象. 我们知道,python中一切皆对象.在这篇文章开始之前,我们 ...

  6. python中如何创建类的对象_python面向对象中如何建立具体的对象?

    我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...

  7. 一文看懂Python(六)-----类与对象篇

    今天给大家介绍"对象".众所周知,Python是一门面向对象的编程语言,Python之所以如此强大,很大一部分原因也是因为Python中无处不对象,由此可知,学好Python的关键 ...

  8. python学习day2:类与对象

    类与对象 一.内置函数 1.int方法 (1)def__add__(self, y):       #两数相加 """ x.__add__(y) <==> x ...

  9. python编程之路——类和对象

    一.类的用法 1.1 类的构造 类即类别.种类,是面向对象设计最重要的概念,对象是特征和技能的结合体,而类是一系列对象相似的特征与技能的结合体. 在程序中,务必保证先定义类,后产生对象. 类和函数的使 ...

  10. Python基础(十八): 类和对象以及它们的属性

    一.类 最简单的经典类结构 class 类名:pass 复制代码 1.定义一个类 class Money:pass 复制代码 类名规范: 驼峰命名法, 并且首字母大写 2.实例化一个对象 创建一个对象 ...

最新文章

  1. 小白也能看懂:一文学会入门推荐算法库 surprise
  2. python 离线下载和安装第三方库 .whl wheel 文件
  3. 全志a64linux内核编译,芯灵思Sinlinx A64 Linuxqt编译安装
  4. opencv imencode和imdecode使用,用于网络传输图片
  5. 自媒体发展陷入僵局,社群媒体将成出路?呵呵…
  6. html给文字添加阴影效果,text-shadow css文字阴影_字体投影属性样式
  7. 实现商城类APP的筛选项效果
  8. auto.js适合安卓小米6,朋友圈触控点赞
  9. Integer在webservice的传递
  10. 【数据库】sql2008卸载和默认实例的删除
  11. modscan36--my milestone
  12. Jasper报表导出pdf中文不显示——Font simsun is not available to the JVM. See the Javadoc for more det,已解决
  13. 搭建Mybatis源码环境
  14. HTML背景图片的设置
  15. 《大学物理》知识点总结
  16. 搭建sql注入平台及DVWA漏洞环境
  17. 你不得不读的好书 ——《此生未完成》读后感
  18. crossdomain.xml 文件安全配置 百度云观测、360网站监测 dz论坛crossdomain.xml
  19. 百度迟到移动互联网:寻入口级产品 文化成挑战
  20. Monkey测试黑白名单

热门文章

  1. Apahce HTTPd 2.4.49(CVE-2021-41773)漏洞复现详细教程
  2. 小表妹想学鸿蒙(HarmonyOS)开发板,于是我翻出了所有的鸿蒙开发板,靠,全给我抢走了,简直是野蛮表妹!
  3. 正在配置您的计算机用于信息权限管理,在 Office 2013 中配置信息权限管理
  4. 官方教程 Redshift 05 AOVs
  5. php 生成图片并压缩保存到本地或者输出到网页imagejpeg方法
  6. SAP那些事-职业篇-8-顾问“三宝”
  7. Android 10 适配及具体解决办法,实战篇
  8. RGBA 与 opacity不得不说的故事
  9. 你不得不知道的polyfill
  10. 如何查找无物流信息单号