我有一个名为'Movable Piece'的类。当然,我希望这个班级的每个实例都可以移动。为此,我认为另一个名为'运动'的课程会很好,并且可以重复使用以防我需要其他东西移动。此外,我很喜欢my_piece.move.up
在代码中的外观。为Python中的实例动态创建方法
当我意识到需要动态地尝试设置由Piece实例化的Movements类的实例的方法时,问题就出现了,因为移动该部分的功能也可以由用户定义。我怎样才能做到这一点?我认为该代码将阐明我想要做的事情。
class MovablePiece(Piece):
class Movements:
def __init__(self, piece, movement_functions=None):
if movement_functions is None:
self.__default_movements(piece)
else:
self.__set_movements(movement_functions)
def __default_movements(self, piece):
def up(): return piece.move(piece.surroundings[Direction.UP])
def right(): return piece.move(piece.surroundings[Direction.RIGHT])
def down(): return piece.move(piece.surroundings[Direction.DOWN])
def left(): return piece.move(piece.surroundings[Direction.LEFT])
self.__set_movements([up, right, down, left])
def __set_movements(self, movement_functions):
for movement_function in movement_functions:
setattr(self, movement_function.__name__, movement_function)
def __init__(self, letter, name, movements=None, walkable=False):
Piece.__init__(self, letter, name, walkable)
self.move = MovablePiece.Movements()
这当然是行不通的:SETATTR正试图设置功能属性,我不认为做多大意义,但你得到它的要点。
这是错误,当我尝试做my_piece.move.right
:
Traceback (most recent call last):
File "main.py", line 45, in <module>
screen.show()
File "/home/joaquin/Documents/escape/ludema/screen.py", line 12, in show
function()
File "main.py", line 35, in control_bruma
mappings[action]()
File "/home/joaquin/Documents/escape/ludema/pieces.py", line 78, in right
def right(): return piece.move(piece.surroundings[Direction.RIGHT])
TypeError: 'Movements' object is not callable
类似的问题,如果我强迫的方法是staticmethods(因为他们实际上并不需要“自我”):
Traceback (most recent call last):
File "main.py", line 45, in <module>
screen.show()
File "/home/joaquin/Documents/escape/ludema/screen.py", line 12, in show
function()
File "main.py", line 35, in control_bruma
mappings[action]()
TypeError: 'staticmethod' object is not callable
'setattr()'应该可以正常工作。问题可能是函数没有被定义为接受“自我”第一个参数,所以它们不是合适的方法。 – martineau
它没有。我会附上回溯给出的错误。 – joaquinlpereyra
@martineau当我尝试使它们成为静态方法时,我添加了回溯函数,它不容易获取参数:) – joaquinlpereyra