08.05 特殊方法
特殊方法
Python 使用 __ 开头的名字来定义特殊的方法和属性,它们有:
__init__()__repr__()__str__()__call__()__iter__()__add__()__sub__()__mul__()__rmul__()__class____name__
构造方法 __init__()
之前说到,在产生对象之后,我们可以向对象中添加属性。事实上,还可以通过构造方法,在构造对象的时候直接添加属性:
1class Leaf(object):
2 """
3 A leaf falling in the woods.
4 """
5 def __init__(self, color='green'):
6 self.color = color
默认属性值:
1leaf1 = Leaf()
2
3print leaf1.color
green
传入有参数的值:
1leaf2 = Leaf('orange')
2
3print leaf2.color
orange
回到森林的例子:
1import numpy as np
2
3class Forest(object):
4 """ Forest can grow trees which eventually die."""
5 def __init__(self):
6 self.trees = np.zeros((150,150), dtype=bool)
7 self.fires = np.zeros((150,150), dtype=bool)
我们在构造方法中定义了两个属性 trees 和 fires:
1forest = Forest()
2
3forest.trees
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]], dtype=bool)
1forest.fires
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]], dtype=bool)
修改属性的值:
1forest.trees[0,0]=True
2forest.trees
array([[ True, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]], dtype=bool)
改变它的属性值不会影响其他对象的属性值:
1forest2 = Forest()
2
3forest2.trees
array([[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
...,
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]], dtype=bool)
事实上,__new__() 才是真正产生新对象的方法,__init__() 只是对对象进行了初始化,所以:
1leaf = Leaf()
相当于
1my_new_leaf = Leaf.__new__(Leaf)
2Leaf.__init__(my_new_leaf)
3leaf = my_new_leaf
表示方法 __repr__() 和 __str__()
1class Leaf(object):
2 """
3 A leaf falling in the woods.
4 """
5 def __init__(self, color='green'):
6 self.color = color
7 def __str__(self):
8 "This is the string that is printed."
9 return "A {} leaf".format(self.color)
10 def __repr__(self):
11 "This string recreates the object."
12 return "{}(color='{}')".format(self.__class__.__name__, self.color)
__str__() 是使用 print 函数显示的结果:
1leaf = Leaf()
2
3print leaf
A green leaf
__repr__() 返回的是不使用 print 方法的结果:
1leaf
Leaf(color='green')
回到森林的例子:
1import numpy as np
2
3class Forest(object):
4 """ Forest can grow trees which eventually die."""
5 def __init__(self, size=(150,150)):
6 self.size = size
7 self.trees = np.zeros(self.size, dtype=bool)
8 self.fires = np.zeros((self.size), dtype=bool)
9
10 def __repr__(self):
11 my_repr = "{}(size={})".format(self.__class__.__name__, self.size)
12 return my_repr
13
14 def __str__(self):
15 return self.__class__.__name__
1forest = Forest()
__str__() 方法:
1print forest
Forest
__repr__() 方法:
1forest
Forest(size=(150, 150))
__name__ 和 __class__ 为特殊的属性:
1forest.__class__
__main__.Forest
1forest.__class__.__name__
'Forest'