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

时间:2016-05-25 01:23:13

标签: 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()

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

1 个答案:

答案 0 :(得分:6)

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

首先,您创建一个新玩家

player_test = Player()

创建一个新玩家意味着在该类上调用__init__方法,所以我们这样做......

class Player(object):
    def __init__(self:
        self.weapon = "rifle"
        self.rifle_test = Rifle(self)

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

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

好吧,我们的步枪已经创建了,我们打电话给self.player.check()

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

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

您拥有的check的定义取决于初始化的self.dictionary,但您拥有的self.dictionary取决于定义的self.rifle_test,其中转向取决于check

这是一种循环依赖,它无法发挥作用;你需要重新设计。我建议您从步枪check()中删除对__init__的来电。