专栏首页python3习题34:模块,类,对象

习题34:模块,类,对象

面向对象编程是很重要的,结构化,代码重用性等等

模块和字典差不多

模块(module),记住这个‘从Y获取X’的概念,模块属性

1 模组是包含函数和变量的python文件

2 可以import这个文件

3 然后可以使用‘.’(点)操作符访问到模组中的函数和变量

做个简单的实验

创建一个名字叫mystuff.py文件,并且在里面放了个叫做apple的函数,代码如下

# coding: utf-8
__author__ = 'www.py3study.com'
# this goes in mystuff.py
def apple():
    print("I am apples !")

接下来就可以用import来调用这个模块,并访问到apple函数

创建一个名为ceshi.py文件,注意要在同级目录下,代码如下

# coding: utf-8
__author__ = 'www.py3study.com'
import mystuff
mystuff.apple()

运行程序,应该看到的结果

成功访问到mystuff里面的apple函数

接下来返回到mystuff文件中,添加一行代码,如图

再到ceshi文件中,调用如图

运行代码结果如下

类和模块差不多

类(class),通过类,你可以把一组函数和数据放到一个容器中,从而用'.'(点)操作符访问到它们

如果要用创建mystuff模块的方法来创建一个类,那么大致方法是这样的:

# coding: utf-8
__author__ = 'www.py3study.com'
class Mystuff(object):
    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print("I am classy apples !")

这个和模块比起来有些复杂,确实,比起模块来,这里的确做了很多事情,里边有一个叫做apple()的函数,难懂的是__init__()函数,还有就是设置tangerine变量时用了self.tangerine这样的语法

使用类而非模块的原因如下:可以拿着上面这个类,重复创建很多出来,哪怕是一次一百万个,它们也不会互相干涩到,而对于模块来说,当你一次import之后,整个程序里就只有这么一份内容, 这个是有一定经验的python开发才能理解的

对象相当于迷你版的import

如果说类和迷你模块差不多,那么对于类来说,也必然有一个类似Import的概念,这个概念名称就是“实例(instance)”,它的意思其实是“创建”,当你将一个类“实例化”以后,你就得到了一个对象(object)

实现实例化的方法,就是像调用函数一样地调用一个类:

代码如下

# coding: utf-8
__author__ = 'www.py3study.com'
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)

应该看到的结果

thing = Mystuff()就是‘实例化’操作,这和调用函数很相似,然而当你进行实例化操作时,python在背后做了一系列的工作,针对上面的代码详细解释一下

1 python看到了Mystuff()并且知道了它是你定义过的一个类

2 python创建了一个空的对象,里边包含了你在类中用def创建的所有函数

3 然后python回去检测你是不是在里边创建了一个__init__魔法函数,如果有创建,它就会调用这个函数,从而对你的空对象实现了初始化

4 在Mystuff中的__init__函数里,有一个多余的函数叫做self,这就是python为我们创建的空对象,而我可以对它进行类似模块,字典等的操作,为它设置一些变量进去

5 self.tangerine设成了一段话,这样就初始化了该对象

6 最后python将这个新建的对象赋给一个叫thing的变量,以供后面使用

以上的解释和python的实际原理还是有一点小小出入,单纯个人理解

类就像一种蓝图,或者一种预定义的东西,通过它可以创建新的迷你模块

实例化的过程相当于创建了这么一个迷你模块,而且同时import了它

结果生成的迷你模块就是一个对象,你可以将它赋予一个变量并进行后续操作

类的例子,实践中理解可以加深印象,练习代码如下:

# coding: utf-8
__author__ = 'www.py3study.com'
class song(object):
    def __init__(self, lyrics):
        self.lyrics = lyrics

    def 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"])

happy_bday.sing_me_a_song()
bulls_on_parade.sing_me_a_song()

应该看到的结果

常见问题

为什么创建__init__或者别的类函数时需要多加一个self变量?

如果你不加self, cheese = 'Frank'这样的代码意义就不明确了,它指的既可能是实例的cheese属性,或者一个叫做cheese的局部变量。有了self.cheese = 'Frank'就清楚地知道了这指的是实例属性self.cheese

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 快速写一个爬虫

    今天下班前,老板让我帮忙爬一个数据,简单看了下,需要登录,看起来应该不难。回到家,注册一个账号,复制url,然后用postman转代码,简单暴力,直接撸。

    小歪
  • 爬虫学到什么程度可以去找工作

    随便看看知乎上的教程就可以入门了,就Python而言,会requests当然是不够的,还需要了解scrapy和pyspider这两个框架,scrapy_redi...

    小歪
  • appium+python自动化50-生成定位对象模板templet(jinja2)

    每次自己写pageobject定位元素对象太繁琐,格式都差不多,只是换个定位方法,这种就可以才有模板的方式,批量生成pageobject定位元素对象的模板 py...

    上海-悠悠
  • Python常用库整理

    https://pygobject.readthedocs.io/en/latest/#

    爱吃西瓜的番茄酱
  • 强大的异步爬虫 with aiohttp

    看到现在网络上大多讲的都是requests、scrapy,却没有说到爬虫中的神器:aiohttp

    小歪
  • 用Python做简易词云

    最近突发奇想,想做个词云玩玩,这算是Python的一个很初级的应用,虽然很初级,依然免不了会出现各种bug~

    爱吃西瓜的番茄酱
  • python笔记16-执行cmd指令(os.system和os.popen)

    比如我写了个hello.py的脚本,在脚本里面写入内容:print(“hello world!”),放到d盘目录路径为:d:\hello.py

    上海-悠悠
  • 安装python扩展包pylint出错

    用VSCode作为python的IDE,VSCode会提示安装pylint。pylint是python代码风格控制插件,如果你写的代码不符合常见风格,就会报错。...

    fem178
  • python接口自动化23-签名(signature)

    开放的接口为了避免被别人乱调用,浪费服务器资源,这就涉及到签名(Signature)加密了

    上海-悠悠
  • appium+python自动化49-yaml管理定位元素

    如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]。

    上海-悠悠

扫码关注云+社区

领取腾讯云代金券