之前的文章介绍了module和package。
我们知道package是以文件夹的形式组织的,每个文件夹下的.py文件称之为module。而class在每个.py文件中。
最基本的class
一个简单的class示例如下所示:
1
2
3
4
5
6
class MyClass:
"""A simple example class"""
i = 12345#成员变量
def f(self):#成员方法
return 'hello world'
要实例化一个class可以通过new instance=ClassName()的方式实例化。而成员变量和成员方法可以通过instance.name或者instance.function_name的方式调用。
上述MyClass的示例如下:
1
2
3
4
5
c=MyClass()
print(c.i)
#12345
print(c.f())
#hello world
复杂一点的例子
更复杂一点的例子:
1
2
3
4
5
class Complex:
i=[]
def __init__(self, realpart, imagpart):
self.r = realpart
self.i.append(imagpart)
调用方式:
1
2
3
4
5
6
x = Complex(3.0, -4.5)
print(x.r,x.i)
#3.0 [-4.5]
xx = Complex(3.0, -2)
print(xx.r,xx.i)
#3.0 [-4.5, -2]
这里添加了__init__()内置方法用于初始化class中的成员变量。这里可以看到类Complex的两个实例x和xx中成员变量i的输出是不同的。关于类中的变量作用域将在下文介绍,暂且不表。
class中变量的作用域
首先让我们运行下面的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def scope_test():
def do_local():
spam = "local spam"
def do_nonlocal():
nonlocal spam
spam = "nonlocal spam"
def do_global():
global spam
spam = "global spam"
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
spam='spam'
scope_test()
print("In global scope:", spam)
得到的输出是:
1
2
3
4
After local assignment: test spam
After nonlocal assignment: nonlocal spam
After global assignment: nonlocal spam
In global scope: global spam
下面将对上述代码进行分析:
首先定义了全局变量spam,并赋值‘spam’。
接着实例化类scope_test(),执行类中的代码:
1
2
3
4
5
6
7
spam = "test spam"
do_local()
print("After local assignment:", spam)
do_nonlocal()
print("After nonlocal assignment:", spam)
do_global()
print("After global assignment:", spam)
- 第一个变量spam的作用域是类
scope_test,并将局部变量spam赋值为test spam。 do_local()中spam变量的作用域是do_local()方法,因而只是创建了一个本地变量,并赋值为local spam,但在方法之外失效。- 此时,print方法打印的
spam变量是第一步中的局部spam变量,输出即是test spam。 do_nonlocal()方法中将spam变量通过nonlocal关键字表示使用的是局部变量,因而此时的spam是第一步声明的spam局部变量。此时spam变量的值变为nonlocal spam。- 按照上一步分系,此时打印的值应该是
nonlocal spam do_global()中通过global关键字声明使用的spam是全局变量,因而全局变量spam的值修改为global spam- 这里输出的是局部变量spam,因而输出是
nonlocal spam
最后回到最外层的代码:
1
print("In global scope:", spam)
这里的变量spam是全局变量,根据上面的分析可以知道spam已经被修改为global spam,因而输出是global spam。
以上介绍了python中class的基本使用方法,之后介绍了class中变量的作用域范围,了解之后基本就能掌握class的基本使用方法了。