笨方法学Python—习题40:模块、类和对象

Python是一种面向对象biancheng(OPP)语言。即,Python中有一种叫做类(class)的结构,通过它可用一种特殊的方式构造软件。

模块和字典差不多

字典:一种将一个东西对应到另外一个的方式— 若有一个字典,其有一个叫‘apple’的键,想获取值就需要:
mystuff = {'apple': "I AM APPLES!"}
    print mystuff['apple']                     #字典获取值的方式

模块:1)包含函数和变量的Python文件;2)可以导入这个文件;3)导入后就可使用.操作符访问其中的函数和变量
假设已有一个名为mystuff.py的模块,且里边有一个叫apple的函数和一个叫tangerine的变量:
# this goes in mystuff.py
def apple():
    print "I AM APPLES!"
# this is just a variable
tangerine = "Living reflection of a dream"
可以用import来调用这个模块,并且访问函数apple和变量tangerine
### 如果mystuff.py没有存放在Python默认的目录(寻找模块的地方),就需要告诉解释器去哪里找
      import sys, pprint  
           pprint.pprint(sys.path)     # 可以查看解释器默认的路径,你可以将你的模块放在site_packages目录下(最佳)
           sys.path.append('模块所在目录')  #还可以告诉解释器除了默认目录,还要去这个目录下查看                                                                                                                     (C:\Users\Administrator\Canopy\licenses)###
import mystuff
mystuff.apple()
print mystuff.tangerine
###若模块中内容修改了,需要重新导入:
       mystuff = reload(mystuff)###
可发现字典和模块使用方式有点类似,只是语法不同([键]和.键):
Python里一个通用模式:1)类似“键=值”风格的容器;2)通过“键”的名称获取其中的值

类和模块差不多

Python中的代码结构可实现上述通用模式:通过类可将一组函数和数据放到一个容器中,从而用.操作符访问它们。
# 创建mystuff类
class MyStuff(object):

    def __init__(self):
        self.tangerine = "And now a thousand years between"

    def apple(self):
        print "I AM CLASSY APPLES!"
使用类而非模块的原因:其重复创建很多出来(类可以多次实例化),这些实例之间也不会相互干涉;而模块一次导入之后,整个程序中只有这么一份内容

对象相当于迷你导入

类似于模块import的导入操作,类的称为“实例化”—即创建。当将一个类“实例化”之后,就得到了一个对象(object)
实现实例化的方法:像调用函数一样调用一个类
thing = MyStuff()    # thing就是MyStuff类实例化后的一个对象
thing.apple()
print thing.tangerine
###还可以继续实例化:
        a = MyStuff()   #a是MyStuff类实例化后的一个对象
        b = MyStuff()   #b也是MyStuff类实例化后的一个对象
        a, b同样可以调用apple()函数和tangerine属性,a, b, thing之间无影响###
第一行代码就是实例化操作,和调用函数类似。但是Python其实在背后做了一系列的工作(迷你导入过程):
1) Python看到MyStuff()并且知道了它是你定义过的一个类
2) Python创建了一个空对象,里边包含了你在该类中用def创建的所有函数
3) 然后Python回去检查你是否在里边创建了一个__init__函数,若创建了,它就会调用这个函数,对你新创建的对象实现了初始化
4) 在MyStuff的__init__函数里,有一个多余的函数叫做self,它就是Python创建的空对象,我们可对其进行类似模块、字典等的操作,为它设置一些变量进去
5) 上面将self.tangerine设成了一段歌词,这样我就初始化了该对象
6) 最后,Python将这个新建的对象赋给一个叫thing的变量,以供后面使用
此过程并不是拿来一个类直接就用,而是将类作为一个“蓝图”,然后用它创建和这个类有相同属性的副本。
但本质上,类和对象与模块是完全不同的东西:
1. 类是像一种蓝图或者预定义的东西,通过它可以创建新的迷你模块
2. 实例化的过程相当于你创建了这么一个迷你模块,同时导入了它
3. 结果创建的迷你模块就是一个对象,你可以将它赋予给一个变量并进行后续操作。

获取某样东西里包含的东西

现有三种方法:
# dict style
mystuff['apple']

# module style
mystuff.apples()
print mystuff.tangerine

# class style
thing = MyStuff()
thing.apples()
print thing.tangerine

第一个关于类的例子

class Song(object):

    def __init__(self, lyrics):
        self.lyrics = lyrics
    
    def sing_me_a_song(self):
        for s in self.lyrics:
            print s

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

应该看到的结果

$ python ex40.py
Happy birthday to you
I don't want to get sued
So I'll stop right there
They rally around the family
With pockets full of shells

附加练习

1. 使用这种方式写更多歌进去,确定弄懂了传入的歌词是一个字符串列表
2. 将歌词放到另一个变量中,然后在类中使用这个新定义的变量
3. 试着能不能给它加一些新功能,just do it  弄坏了也没事
4. 网上搜索“object oriented programming”(面向对象编程),给自己洗洗脑

常见问题回答

为什么创建__init__或者别的类函数时需多加一个self变量?
若不加self,那类中的cheese = 'Frank'这样的代码意义就不明确了,它既可能指实例的cheese属性,又可能是一个叫做cheese的局部变量。而有了self.cheese = 'Frank'就可清楚知道是指实例的属性self.cheese
展开阅读全文

没有更多推荐了,返回首页