Python - Class
类定义
- 类的定义就像函数的定义,要先执行才能生效。
- 类定义之后,就会创建一个新的命名空间, 作为局部作用域。所有的赋值和函数名会成为命名空间的局部变量。
- 类定义正常退出时,一个类对象就创建了。
- Python 类中的方法的第一个参数通常是
self
,这是一个约定。如果不遵循这个约定,对其他 Python 程序员而言你的代码可读性就会变差,而且有些浏览器程序也可能遵循此约定编写的。self
是类方法的第一个参数,它就是类的实例对象自己,当调用方法时:A().func()
等同于A().func(A)
然后,类中的方法就可以通过self
来调用该方法外面的方法或者变量了。这和 C++ 中隐式的this
类似。
类对象
类对象支持两种操作: Attribute References and Instantiation (属性引用和实例化)
类的 Attribute References 使用 Python 中标准的属性引用语法:obj.name
。
类的 Instantiation 使用函数的符号。可以假设类对象是一个不带参数的函数,该函数返回这个类的一个新实例。x = A()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21>>> class A :
'''A simple example class'''
a = 0
def func(self) :
b = self.a + 1
print(b)
>>> A.a
0
>>> A().a
0
>>> A.func # 直接引用类 A 中的函数 func,注意,如果类 A 不需要传参,这样就是实例化之后的引用了。
<function A.func at 0x000000D5EB96E8C8>
>>> A().func # 实例化类 A 之后,引用函数 func
<bound method A.func of <__main__.A object at 0x000000D5EB9716D8>>
>>> A().func() # 实例化类 A 之后,调用函数 func
1
>>> A.__doc__
'A simple example class'
>>> A().__doc__
'A simple example class'
实例化操作将创建一个空的对象。很多类希望创建的对象可以自定义一个初始状态,因此,可以在类中定义一个名为 __init__()
的特殊方法。类似其它语言的构造函数__construct()
。1
2
3
4
5
6
7
8
9
10
11
12
13
14>>> class B :
a = 0
def __init__(self, m) :
self.a = m
def func(self) :
b = self.a
print(b)
>>> B.a
0
>>> B().func()
TypeError: __init__() missing 1 required positional argument: 'm'
>>> B(1).func()
1
Class Variable and Instance Variable (类变量和实例变量)
Class Variable shared by all Instances, Instance Variable unique to each Instance.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16>>> class A :
a = [0]
def __init__(self, m) :
self.a.append(m) # 'a' 为 Class Variable
def func(self) :
b = self.a # 'a' 为 Class Variable
print(b)
>>> B = A(1)
>>> B.func()
[0, 1]
>>> C = A(2)
>>> C.func()
[0, 1, 2]
>>> B.func()
[0, 1, 2]
__init__()
和 func()
里面的 a
都是引用了函数外面的 a
,所以都是 Class Variable,对所有 Instance 都是共享的。
1 | >>> class A : |
__init__()
中对 a
进行赋值操作,就相当于创建了一个局部的 a
(B.a、C.a)。所以,在__init__()
里面对 a
的操作是与外面 a
无关的。类中的 __init__()
函数用于创建实例化类的变量 a
(B.a、C.a),因此,func()
函数中就会用实例化对象自己创建的 a
。当实例化对象没有从新定义自己的 a
的时候,就会用继承的共享的 a
。
如果想要在初始化的时候改变 Class Variable a
,可以这样:1
2
3
4
5
6
7
8
9
10
11
12
13>>> class A :
a = 0
def __init__(self, m) :
A.a = m # 直接指定 'a' 的类名
def func(self) :
b = self.a # 因为实例化类中没有创建新的 'a',所以 'a' 是继承类 A 的 Class Variable
print(b)
>>> B = A(1)
>>> B.func()
1
>>> A.a, B.a
(1, 1)