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

时间:2017-04-01 17:39:43

标签: python module

我有两个用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

2 个答案:

答案 0 :(得分:2)

通常,您应该尝试最小化模块中的文件级代码量。换句话说,如果您打算导入文件,则该文件中的可执行代码应尽可能位于函数或类中。 cat = Cat("pus")cat.MakeDogTalk()不属于函数或类,因此我将其移至main.py

dogMakeDogTalk内不会显示,因此我会将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()