我有 2 个用 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()
Run Code Online (Sandbox Code Playgroud)
和 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()
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,我正在尝试让狗从猫模块中说话,有什么方法可以实现这一点吗?顺便说一句,我的现实世界应用程序看起来一点也不像这个......当然,现在我收到此错误:
line 9, in MakeDogTalk
dog.talk()
NameError: name 'dog' is not defined
Run Code Online (Sandbox Code Playgroud)
一般来说,您应该尽量减少模块中文件级代码的数量。换句话说,如果您打算导入文件,则该文件中的可执行代码应尽可能位于函数或类内。cat = Cat("pus")并且cat.MakeDogTalk()不在函数或类内,所以我将它们移至main.py.
dog在 内部不可见MakeDogTalk,因此我将dog作为参数传递给 Cat 构造函数或 MakeDogTalk 方法。
方式一:将参数传入构造函数
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()
Run Code Online (Sandbox Code Playgroud)
方式二:将参数传递到方法中
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()
Run Code Online (Sandbox Code Playgroud)
将所有基于狗的逻辑保留在 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)
Run Code Online (Sandbox Code Playgroud)
...但我认为您在实际代码中有充分的理由让 Cat 处理它。
如果确实绝对有必要保留cat = Cat("pus")inside cats.py,那么您必须将其放入函数中。如果它停留在文件级范围,那么将在完成执行MakeDogTalk之前执行,这发生在类存在之前,所以这是不行的。这增加了一个小复杂性,将无法再从 main.py 访问该对象,但您仍然可以通过从函数调用返回该对象来检索该对象。import catsDogcats.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
Run Code Online (Sandbox Code Playgroud)
Dog将类放入自己的文件中也可能是有意义的。由于 Cat 类依赖于 Dog 类,因此 cats 文件应导入 dogs 文件。这样,cat = Cat("pus")如果出于某种原因有必要,您可以将您的内容保留在 cats.py 中并保留在文件级范围内。
#main.py
import cats
cats.cat.talk()
#cats.py
import dogs
class Cat():
def __init__(self, name):
self.name = name
def talk(self):
print("my name is "+self.name)
def MakeDogTalk(self):
dogs.dog.talk()
cat = Cat("pus")
cat.MakeDogTalk()
#dogs.py
class Dog():
def __init__(self, name):
self.name = name
def talk(self):
print("My name is "+self.name)
dog = Dog("Boxer")
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14244 次 |
| 最近记录: |