如何访问另一个对象

时间:2014-09-17 22:47:54

标签: python

我一直在尝试使用__init__方法创建一个类,该方法将从其他对象的属性中收集一些数据。以下代码是我的问题的裸骨示范。

main.py

import foo
import rat
Archive = foo.Foo()
A = rat.Rat()

rat.py

import foo

class Rat:

    def __init__(self):
        self.name = "Hi there"
        self.birthday = Archive.tick

foo.py

import rat
class Foo:

    def __init__(self):
        self.tick = 5

你可以猜到,这不起作用,它告诉我:

in __init__
    self.birthday = Archive.tick
NameError: name 'Archive' is not defined

我不明白为什么它告诉我Archive is not defined。为什么它无法访问我刚刚创建的实例?为什么会发生这种情况?我该如何解决这个问题?

PS:我知道以这种公共方式访问对象的属性通常是一个糟糕的想法,但foo类只是为了拥有一个通用的数据收集对象,没什么大不了的。

2 个答案:

答案 0 :(得分:3)

Archive未在rat.py范围内定义。

在一个被加载的模块中的某个地方定义Archive是不够的 - 您还需要通过导入它或者将其分配给其他名称,使其在任何地方都可用。

所以你有两个选择:

  1. Archive
  2. 中的main导入rat.py
  3. Archive传递给Rat()
  4. 我建议不要输入它。您似乎已经进行了循环导入(foo导入rat,反之亦然)。这有时可行,但通常这是一个坏主意,应该避免。相反,您应该以一种方式设计和构建代码,在这种方式中,您可以对哪些类需要知道什么进行有意识的决定,并且因此,导入其实际需要的模块的内容是什么。 (为什么rat导入foo?它没有对它做任何事情。)

    所以这就是我的建议:

    <强> rat.py

    class Rat(object):
    
        def __init__(self, archive):
            self.archive = archive
            self.name = "Hi there"
            self.birthday = self.archive.tick
    

    <强> main.py

    from rat import Rat
    from foo import Foo
    
    archive = Foo()
    rat = Rat(archive)
    

    与您的问题无关的其他更改:

答案 1 :(得分:1)

<强> rat.py

class Rat:
    def __init__(self, archive):
        self.name = "Hi there"
        self.birthday = archive.tick

<强> main.py

Archive = foo.Foo()
A = rat.Rat(Archive)