我一直在尝试使用__init__
方法创建一个类,该方法将从其他对象的属性中收集一些数据。以下代码是我的问题的裸骨示范。
import foo
import rat
Archive = foo.Foo()
A = rat.Rat()
import foo
class Rat:
def __init__(self):
self.name = "Hi there"
self.birthday = Archive.tick
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
。为什么它无法访问我刚刚创建的实例?为什么会发生这种情况?我该如何解决这个问题?
foo
类只是为了拥有一个通用的数据收集对象,没什么大不了的。
答案 0 :(得分:3)
Archive
未在rat.py
范围内定义。
在一个被加载的模块中的某个地方定义Archive
是不够的 - 您还需要通过导入它或者将其分配给其他名称,使其在任何地方都可用。
所以你有两个选择:
Archive
main
导入rat.py
Archive
传递给Rat()
我建议不要输入它。您似乎已经进行了循环导入(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)
与您的问题无关的其他更改:
object
CamelCase
作为班级名称
答案 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)