In .tilt()
, 你用self.iloc[::-1]
。但是,在此实例方法的范围内,self
只是一个简单、简约的 Python 类,而不是 DataFrame。它对您对局部变量所做的操作一无所知self
代替.arrange()
.
即使你打电话b.arrange()
首先,这确实not就地修改类实例;它修改一个名为的变量的本地副本self
范围内.arrange()
。那是:
>>> b = Board()
>>> b.arrange()
# ...
>>> isinstance(b, pd.DataFrame)
False
看看Pandas 数据结构子类化指南 http://pandas.pydata.org/pandas-docs/stable/development/extending.html#extending-subclassing-pandas。我建议使用组合,因为实际上 Pandas 对象的子类化很快就会变得很复杂。
以下是组合的示例:
class Board(object):
def __init__(self):
self.board = pd.DataFrame(np.arange(1, 65).reshape(8, 8),
index=np.arange(1, 9),
columns=np.arange(1, 9))
def arrange(self):
self.board.loc[1] = ['BP1','BP2','BP3','BP4','BP5','BP6','BP7','BP8']
self.board.loc[2] = ['blR','blK','blB','bQ','bK','brB','brK','brR']
self.board.loc[7] = ['wlR','wlK','wlB','wK','wQ','wrB','wrK','wrR']
self.board.loc[8] = ['WP1','WP2','WP3','WP4','WP5','WP6','WP7','WP8']
return self.board
def tilt(self):
return self.board.iloc[::-1]
Usage:
>>> b = Board()
>>> b.arrange()
1 2 3 4 5 6 7 8
1 BP1 BP2 BP3 BP4 BP5 BP6 BP7 BP8
2 blR blK blB bQ bK brB brK brR
3 17 18 19 20 21 22 23 24
4 25 26 27 28 29 30 31 32
5 33 34 35 36 37 38 39 40
6 41 42 43 44 45 46 47 48
7 wlR wlK wlB wK wQ wrB wrK wrR
8 WP1 WP2 WP3 WP4 WP5 WP6 WP7 WP8
>>> b.tilt()
1 2 3 4 5 6 7 8
8 WP1 WP2 WP3 WP4 WP5 WP6 WP7 WP8
7 wlR wlK wlB wK wQ wrB wrK wrR
6 41 42 43 44 45 46 47 48
5 33 34 35 36 37 38 39 40
4 25 26 27 28 29 30 31 32
3 17 18 19 20 21 22 23 24
2 blR blK blB bQ bK brB brK brR
1 BP1 BP2 BP3 BP4 BP5 BP6 BP7 BP8