Python:如何从另一个模块调用方法?

ole*_*e31 3 python module

我有 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)

Kev*_*vin 6

一般来说,您应该尽量减少模块中文件级代码的数量。换句话说,如果您打算导入文件,则该文件中的可执行代码应尽可能位于函数或类内。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)