Skip to main content
 首页 » 编程设计

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

2025年05月04日15myhome

我在这个问题上遇到了一段时间的麻烦,下面是这个问题的一个例子:

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 执行它一样执行该函数?谢谢。

请您参考如下方法:

你有一些互斥的依赖。仔细查看执行程序时发生的情况:

首先,你创建一个新的播放器

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。

这是一个循环依赖,是行不通的;你需要重新设计。我建议从 Rifle 的 __init__ 中删除对 check() 的调用。