习题34:模块,类,对象

发布时间:2017-11-23 16:02:14编辑:Run阅读(5168)

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

    模块和字典差不多

    模块(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

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

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

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

    图片.png

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

    图片.png

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


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

    图片.png

    再到ceshi文件中,调用如图

    图片.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

    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


    常见问题

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

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








关键字

上一篇: 习题33:字典

下一篇: 习题35:物以类聚