我有两个用python编写的文件。 main.py看起来像这样:
import cats
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
cats.cat.talk()
和cats.py看起来像这样:
class Cat():
def __init__(self, name):
self.name = name
def talk(self):
print("my name is "+self.name)
def MakeDogTalk(self):
dog.talk()
cat = Cat("pus")
cat.MakeDogTalk()
正如你所看到的,我正试图让猫模块中的狗说话,有没有办法让这个工作?我真实世界的应用程序看起来没有像这btw ...... 当然,现在我收到了这个错误:
line 9, in MakeDogTalk
dog.talk()
NameError: name 'dog' is not defined
答案 0 :(得分:2)
通常,您应该尝试最小化模块中的文件级代码量。换句话说,如果您打算导入文件,则该文件中的可执行代码应尽可能位于函数或类中。 cat = Cat("pus")
和cat.MakeDogTalk()
不属于函数或类,因此我将其移至main.py
。
dog
在MakeDogTalk
内不会显示,因此我会将dog
作为参数传递给Cat构造函数或MakeDogTalk方法。
方法1:将参数传递给构造函数
import cats
#main.py
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
cat = cats.Cat("pus", dog)
cat.MakeDogTalk()
cat.talk()
#cats.py
class Cat():
def __init__(self, name, dog):
self.name = name
self.dog = dog
def talk(self):
print("my name is "+self.name)
def MakeDogTalk(self):
self.dog.talk()
方法2:将参数传递给方法
import cats
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
cat = cats.Cat("pus")
cat.MakeDogTalk(dog)
cat.talk()
#cats.py
class Cat():
def __init__(self, name):
self.name = name
def talk(self):
print("my name is "+self.name)
def MakeDogTalk(self, dog):
dog.talk()
将所有基于狗的逻辑保留为main.py:
也是很简单的#main.py
import cats
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
cat = cats.Cat("pus")
dog.talk()
cat.talk()
#cats.py
class Cat():
def __init__(self, name):
self.name = name
def talk(self):
print("my name is "+self.name)
...但我认为你的真实代码中有一个很好的理由让Cat处理它。
如果真的有必要将cat = Cat("pus")
保留在cats.py
内,那么你必须把它放在一个函数中。如果它保持在文件级范围,则MakeDogTalk
将在import cats
完成执行之前执行,这在Dog
类甚至存在之前发生,因此这是不可行的。这会增加一个小的复杂性,{!1}}将无法再从main.py访问,但您仍然可以通过从函数调用中返回来检索该对象。
cats.cat
将#main.py
import cats
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
cat = cats.do_cat_thing(dog)
cat.talk()
#cats.py
class Cat():
def __init__(self, name):
self.name = name
def talk(self):
print("my name is "+self.name)
def MakeDogTalk(self, dog):
dog.talk()
def do_cat_thing(dog):
cat = Cat("pus")
cat.MakeDogTalk(dog)
return cat
类放在自己的文件中也是有意义的。由于Cat类依赖于Dog类,因此cats文件应该导入dog文件。这样,您可以将Dog
保留在cats.py和文件级范围内,如果出于某种原因需要这样做。
cat = Cat("pus")
答案 1 :(得分:1)
你在MakeDogTalk中引用了狗,但它不知道它是什么。将其添加到MakeDogTalk:
def MakeDogTalk(self):
from main import dog
dog.talk()