更好的方法是,以在初始化一個Game
對象「通過」,以Player
使用DI(依賴注入):
class Player(object):
def __init__(self, game):
self.game = game
def print_player(self):
print self.game.board
class Game(object):
def __init__(self):
self.board = range(9)
if __name__ == "__main__":
game = Game()
player = Player(game)
player.print_player() # prints [0, 1, 2, 3, 4, 5, 6, 7, 8]
依託globals()
是not a good practice,因爲它依賴執行順序上(就像你的情況一樣),使得代碼不易讀(你必須從一個地方跳到另一個地方,而不是「流利」地閱讀),以及它可能會帶來副作用。
壞的做法(又名不要在家裏做!):
下面的代碼(雖然這是一個不好的做法),因爲減速的順序將工作當你使用globals()
是有意義的: game = Game()
應聲明之前類Player
,以便它在那裏使用:
class Game():
def __init__(self):
self.board = range(9)
game = Game()
class Player():
global game
print game.board
p = Player() # prints [0, 1, 2, 3, 4, 5, 6, 7, 8]
您不是「從Player類實例訪問Game類實例」。您正在通過Player類定義*訪問它,該類在定義類時執行一次。如果代碼是在Player的一個方法中定義的,這段代碼就可以工作。同樣可疑的是在Game類定義中對Player'p'的類級別引用。您可能需要將其移至Game的'__init__'方法。 – 2015-02-09 04:21:29
它不起作用,因爲當解釋器創建'''Player'''時,''''game'''不存在。你有一個難題,每個類都有對另一個的引用,但是因爲Python是按順序創建對象的,所以不管你如何重新排列定義,總是不會存在。你需要重新考慮設計。 – wwii 2015-02-09 04:39:29
@StevenRumbalski你說得對,game.board訪問是在Player類定義中,而不是一個實例。我一直在考慮一旦Player類實例化它將被訪問,但我的措辭不正確。 – Debugging 2015-02-09 06:17:50