LoginSignup
0
0

More than 3 years have passed since last update.

PythonでのimportによるオブジェクトIDの違い

Posted at

環境

windows 10 Pro
version : Python 3.8 (docker)

一行でいうと

状態管理のファイルを分けるのをサボってハマった話、サボるな。

本題

game.py
from status import Status

class Game():
  def __init__():
    self.status = Status.NOTHING
status.py
from enum import Enum, auto

class Status(Enum):
    NOTHING = auto()
    WAITING = auto()
    PLAYING = auto()

class GameStatus():
  def start():
    if self.game.status == Status.NOTHING:
      ...
    if self.game.status == Status.WAITING:
      ...
    if self.game.status == Status.PLAYING:
      ...

Statusによって処理を変えるって感じですね。
Statusを列挙型で作成し、初期状態Status.NOTHINGでゲームの流れによってStatesがWAITINGやPLAYINGに変更するって感じです。
game.pyのGameクラスではStatusをimportしていますが、status.pyでは同一ファイル内にStatusがあるため、importしていません。
ここでオブジェクトIDに齟齬が発生し、init関数で代入した Status.NOTHING のみオブジェクトIDが異なり、等値比較が成立しません。
列挙型の等値比較が値ではなくオブジェクトIDを参照しているのではないかと思われます。

サボらずに

gamestatus.py
from status import Status

class GameStatus():
  def start():
    if self.game.status == Status.NOTHING:
      ...
    if self.game.status == Status.WAITING:
      ...
    if self.game.status == Status.PLAYING:
      ...
status.py
from enum import Enum, auto

class Status(Enum):
    NOTHING = auto()
    WAITING = auto()
    PLAYING = auto()

って感じでファイルを分割し、全ファイル使用する際はimportする手順を踏むことでimportの有無によるオブジェクトIDの違いはうまれないです。

サボらずにきちんとファイルを分割しましょう。。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0