您的位置:首页 > 编程语言 > Python开发

Learn Python The Hard Way学习(40) - 模块,类和对象

2012-07-04 15:29 302 查看
python是面向对象的编程语言,就是说python让你使用class去组织你自己的软件。类可以让你的程序更加一致,调用更加简单,理论上是这样的。

现在我们使用刚学到的字典和模块来解释面向对象编程、类和对象。我的观点是OOP是很奇怪的东西,为什么这么说呢,先学习这一章,下一个练习我会解释。

模块就像字典
你已经知道字典是怎么被创建和使用的,并且可以用一个东西映射另外一个东西,比如:
mystuff = {'apple': "I am apples!"}
print mystuff['apple']

保持从x中取y的想法,这和模块很像,关于模块你还需要知道:

一个python文件,里面有很多变量和函数
你可以导入这个文件
你可以用 . 来访问模块中的函数和变量

想象一下,我有一个包含apple函数的模块文件mystuff.py:

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

我可以使用下面的方法使用apple函数:
import mystuff
mystuff.apple()

还可以在mystuff中添加一个变量:

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

tangerine = "Living reflection of a dream"

用相同的方法访问:

import mystuff
mystuff.apple()

print mystuff.tangerine

让我们对比一下模块和字典:
mystuff['apple']

mystuff.apple()

mystuff.tangerine

这表明,python有一种共同的模式:

建立一种key=value的模式
使用key的名称调用value

在字典中key是字符串,调用语法是[key],在模块中,key是标示符,调用方法是 .key,这两个东西很像吧。

类就像模块
你可以认为模块就是一个特殊的字典,它可以保存python代码,通过 . 号调用。python还有一个类似实现这种目的的结构,叫做类。一个类包含了很多函数和数据,可以通过 . 去访问它们。

如果我要写一个类似mystuff的类,就像这样:
class mystuff(object):
def __int__(self):
self.tangerine = "Hello"

def apple(self):
print "apple"

和模块比有点复杂,不过你可以认为它就是一个迷你模块。让人疑惑的是__init__()函数和self.tangerine设置tangerine变量的值。

这里是用类替代模块的原因:你可以在一个程序中使用同一个类很多次,它们不相互影响,但是一个程序中只能导入一个模块。

理解这些之前,你必须理解什么是对象。

对象就像迷你的导入
如果类像模块,那么类也会有类型模块的导入功能。就是实例化,如果你实例化一个类,得到的就是一个对象。

使用类的方法类似调用函数,像这样:
thing = mystuff()
thing.apple()
print thing.tangerine

第一步是实例化,然后调用它的函数,我们通过上面的代码分析一下python是怎么按照顺序执行的:

python寻找Myclass,看看你是不是定义了这个类。
python为你在类里面定义的函数创建一个空对象。
如果类中有魔术方法__init__,那么就会使用这个函数初始化你的空对象。
在__init__方法中有一个额外的变量self,这就是python为我们创建的空对象,你可以给这个变量赋值。
这样的话,我给 thing.tangerine赋了句歌词,并且初始化了这个对象。
那么现在python就可以把这个刚完成的对象赋给一个变量thing了。

这就是我们为什么像调用函数一样导入一个类。

记住,我给出的不是一个非常准确类的工作方法,仅仅是为了你能通过模块而更好的理解类。事实是,类和对象和模块不是一个东西,老实说的话,就像下面这样:

类就像一个蓝图,定义用来创建一个迷你模块。
实例化就是导入的同时使用这个迷你模块。
创建出来的迷你模块就是对象,赋给一个变量,然后通过这个变量工作。

虽然从模块过渡到类和对象比较难,不过也只有这个方法比较好理解。

从东西中取出东西
现在有三种方法:
# 字典
mystuff['apple']

# 模块

mystuff.apple()

print mystuff.tangerine

# 类

thing = mystuff()
thing.apple()
print thing.tangerine

第一个类
你可能还有很多疑问,不要着急,暂时先放放这些疑问,下一个练习我们学校面向对象的知识,下面我们先了解一下类的写法,为下一练习做准备。
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 relly around the family",
"With pockets full of shells"])

happy_bday.sing_me_a_song()
bulls_on_parade.sing_me_a_song()


运行结果

Happy birthday to you
I don't want to get sued
So I'll stop right there
they relly around the family
With pockets full of shells

加分练习
1. 打印更多的歌词,确保你知道我们传递了一个list给类中的lyrics。

2. 把歌词分开使用不同的变量,然后传递到类里面使用。

3. 尝试做更多的事情,不用担心破坏这个类。

4. 网上找一个面向对象编程的知识,如果这些对你没什么意义,不用担心,这些东西的一半对我也没意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: