面向对象编程是很重要的,结构化,代码重用性等等
模块和字典差不多
模块(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