首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >习题34:模块,类,对象

习题34:模块,类,对象

作者头像
py3study
发布2018-08-02 15:20:22
2890
发布2018-08-02 15:20:22
举报
文章被收录于专栏:python3python3

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

模块和字典差不多

模块(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 !")
图片.png
图片.png

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

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

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

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

图片.png
图片.png

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

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

图片.png
图片.png

再到ceshi文件中,调用如图

图片.png
图片.png

运行代码结果如下

图片.png
图片.png

类和模块差不多

类(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)

应该看到的结果

图片.png
图片.png

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()

应该看到的结果

图片.png
图片.png

常见问题

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档