为什么我不能从另一个类访问实例的属性?

bla*_*ole 1 python

我暂时遇到这个问题,以下是问题的一个例子:

class Player(object):
    def __init__(self):
        self.weapon = "rifle"
        self.rifle_test = Rifle(self)
        self.dictionary = {}
        self.dictionary["rifle"] = self.rifle_test

    def check(self):
        print(self.weapon)
        print(self.dictionary[self.weapon].ammo)

class Rifle(object):
    def __init__(self, player):
        self.ammo = 10
        self.player = player
        self.player.check()

player_test = Player()
Run Code Online (Sandbox Code Playgroud)

我有一个玩家("player_test")和一个步枪("rifle_test").当我在Rifle()中调用check()时,控制台中没有打印任何内容.我已经尝试过移动东西,将两个类分开并且没有在player_test中使用rifle_test等.主要问题是:当我从另一个实例执行特定实例的函数时,该函数被执行但不被视为是是从携带它的实例执行的.换句话说,如果我从Rifle()执行check(),它将与我从player_test执行它不同.有没有办法执行该功能,就像我从player_test执行它一样?谢谢.

Ham*_*mms 6

您有一些互斥的依赖项.仔细查看执行程序时会发生什么:

首先,您创建一个新玩家

player_test = Player()
Run Code Online (Sandbox Code Playgroud)

创建一个新的播放器意味着调用__init__该类的方法,所以我们这样做......

class Player(object):
    def __init__(self:
        self.weapon = "rifle"
        self.rifle_test = Rifle(self)
Run Code Online (Sandbox Code Playgroud)

哦! 但到了一半,我们制造了一支新步枪.

class Rifle(object):
    def __init__(self, player):
        self.ammo = 10
        self.player = player
        self.player.check()
Run Code Online (Sandbox Code Playgroud)

好吧,我们的步枪已经创建,我们称之为self.player.check():

def check(self):
    print(self.weapon)
    print(self.dictionary[self.weapon].ammo)
Run Code Online (Sandbox Code Playgroud)

可是等等!我们从未在第一时间完成创建播放器.此时,虽然self.weapon已定义,self.dictionary但实际上尚未创建.

check你所拥有的定义取决于是否有一个初始化self.dictionary,但你self.dictionary所拥有的取决于有一个被定义的self.rifle_test,而这又取决于check.

这是一个循环依赖,它不会起作用; 你需要重新设计.我建议check()你从你的步枪上取下电话__init__.