私は 'Movable Piece'というクラスを持っています。もちろん、私はこのクラスのすべてのインスタンスを動かしたいと思います。そのために、私はMovementという別のクラスがいいと思っていました。移動するために他のものが必要な場合に備えて再利用可能です。また、私はコードでmy_piece.move.up
がどのように見えるのかが大好きです。Pythonでインスタンスのメソッドを動的に作成
問題は、ピースを動かす関数がユーザー定義である可能性があるため、ピースによってインスタンス化された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()'は正常に動作するはずです。問題は、関数が 'self'最初の引数を受け入れるように定義されていないため、適切なメソッドではない可能性があります。 – martineau
それはありません。私はトレースバックによって与えられたエラーを添付します。 – joaquinlpereyra
@martineauパラメータを取らない静的メソッドを作成しようとしたときのトレースバックを追加しました:) – joaquinlpereyra