ゲームのキャラクターをクラス化するときに
class Player:
 def __init__(self, hp, mp, defense, speed):
  self.hp = hp
  self.mp = mp
  self.defense = defense
  self.speed = speed

 def attack(self, target):
  # 攻撃処理
  pass

こんな感じでやると思うけど
例えばattackの引数の部分って
(1)相手のキャラクターオブジェクトを入れる
(2)キャラクターのHPなど、使うパラメーターだけ入れる
のかどっちが良いのだろう

(1)の場合って
#攻撃処理 の部分でtarget.counter(self)とかできて便利そうだけど
パット見、内部で何やってるかわかりにくそう?
(2)の場合だと
attackの返り値を、攻撃され後のHPを返すとかにすると
player2.hp = player1.attack(player2.hp)
みたいに冗長感でる

(1)の方が、おそらく他のメソッド追加したときに基本は引数targetの一つで修正しやすそう
でも、もっとオブジェクト化してPlayerクラス以外の戦闘システムクラスとか作れば
player2.hp = player1.attack(player2.hp)の部分も見やすくなるし、より具体的なメソッド名にすればいい
どこまで分割して設計するかが難しいな・・
あと(1)でやってしまうと、あとでtargetの仕様が変わった時に
target引き継いだメソッド全部チェックしないといけないような