簡體   English   中英

Python:如何從另一個模塊調用方法?

[英]Python: How to call a method from another 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()

和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()

如您所見,我正在嘗試通過cats模塊使狗說話,有什么方法可以使這項工作嗎? 我的真實世界的應用程序看起來並不像這樣……當然,現在我收到此錯誤:

line 9, in MakeDogTalk 
dog.talk()
NameError: name 'dog' is not defined

通常,您應盡量減少模塊中文件級代碼的數量。 換句話說,如果要導入文件,則在可能的情況下,該文件中的可執行代碼應位於函數或類中。 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 MakeDogTalk完成執行之前執行,這在Dog類甚至還沒有存在之前就發生了,因此這是MakeDogTalk 這增加了一個小的復雜性,即cats.cat將不再可以從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.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

也可以將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")

您在MakeDogTalk中引用了dog,但是它不知道它是什么。 將此添加到您的MakeDogTalk:

    def MakeDogTalk(self):
        from main import dog
        dog.talk()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM