web-dev-qa-db-ja.com

別のファイルのクラスから関数をインポートしますか?

私はPythonプログラムを楽しみのために書いていますが、別のファイルのクラスから関数をインポートしようとして動けなくなりました。ここに私のコードがあります:

#jurassic park mainframe

from random import randint
from sys import exit
from comm_system import Comm_system #the file i want to import from



class Jpark_mainframe(object):
    def mainframe_home(self):
    print "=====Welcome to the Jurassic Park Mainframe====="
    print "==========Security Administration==============="
    print "===========Communications Systems==============="
    print "===============System Settings=================="
    print "===================Quit========================="

    Prompt = raw_input("What would you like to do? ")

    while Prompt != "Quit":

        if Prompt == "Security Administration":
            print "Please enter the 5-digit passcode:"
            security_passcode = "%d%d%d%d%d" % (2, 0, 1, 2, randint(1, 2))
            security_guess = raw_input(": ")
            security_guesses = 0

            while security_guess != security_passcode and security_guesses < 7:
                print "Incorrect. Please enter the security passcode."
                security_guesses += 1
                security_guess = raw_input(": ")

                if security_guess == security_passcode:
                    print "=========Security Administration======="
                    print "Area 1 Fences: Off"
                    print "Area 2 Fences: On"
                    print "Area 3 Fences: Off"
                    print "Velociraptor Compound: Off"
                    print "Lobby Security System: Off"
                    print "Entrance Facility System: Off"
                    print "To enable all systems, enter 'On'"


                    enable_security = raw_input(": ")

                    if enable_security == "On":
                        print "Systems Online."


        if Prompt == "System Settings":
            print "You do not have access to system settings."
            exit(0)


        if Prompt == "Communications Systems":
            print "===========Communications Systems==========="
            print "error: 'comm_link' missing in directories"
            exit(0)
            return Comm_system.run #this is where I want to return the 
                                                   #the other file

the_game = jpark_mainframe()
the_game.mainframe_home()

別のファイルのクラスからrun()という関数を返したい。ファイルをインポートすると、最初にrun()を含むクラスが実行され、次に元のコードの実行に進みます。なぜこれが起こるのですか?

Comm_systemのコードは次のとおりです。

#communication systems


from sys import exit

class Comm_system(object):
def run(self):

    comm_directory = ["net_link", "tsfa_run", "j_link"]
    print "When the system rebooted, some files necessary for"
    print "communicating with the mainland got lost in the directory."
    print "The files were poorly labeled as a result of sloppy"
    print "programming on the staff's part. You must locate the"
    print "the file and contact the rescue team before the dinosaurs"
    print "surround the visitor's center. You were also notified the"
    print "generators were shorting out, and the mainframe will lose"
    print "power at any moment. Which directory will you search in?"
    print "you don't have much time! Option 1: cd /comm_sys/file"
    print "Option 2: cd /comm_sys/dis"
    print "Option 3: cd /comm_sys/comm"

    dir_choice = raw_input("jpark_edwin$ ")

    if dir_choice == "/comm_sys/file" or dir_choice == "/comm_sys/dis":
        print "misc.txt" 
        print "You couldn't locate the file!"
        print "The system lost power and your computer shut down on you!"
        print "You will not be able to reach the mainland until the system"
        print "comes back online, and it will be too late by then."
        return 'death'

    if dir_choice == "/comm_sys/comm":
        comm_directory.append("comm_link")
        print comm_directory
        print "You found the right file and activated it!"
        print "Just in time too, because the computers shut down on you."
        print "The phonelines are radios are still online."
        print "You and the other survivors quickly call the mainlane"
        print "and help is on the way. You all run to the roof and wait"
        print "until the helocopter picks you up. You win!"
a_game = Comm_system()
a_game.run()
56
Capkutay
from otherfile import TheClass
theclass = TheClass()
# if you want to return the output of run
return theclass.run()  
# if you want to return run itself to be used later
return theclass.run

通信システムの終了を次のように変更します。

if __== '__main__':
    a_game = Comm_system()
    a_game.run()

インポート時および実行時に実行される原因となっているのは、常に実行されている行です。

89
agf
from FOLDER_NAME import FILENAME
from FILENAME import CLASS_NAME FUNCTION_NAME

FILENAMEはサフィックスなし

10
Alon Kogan

私のように、ファンクションパックや他の人がダウンロードできるものを作成したい場合は、非常に簡単です。関数をpythonファイルに記述し、PYTHON DIRECTORYに必要な名前で保存するだけです。これを使用するスクリプトで、次のように入力します。

from FILE NAME import FUNCTION NAME

注-大文字の部分は、ファイル名と関数名を入力する場所です。

これで、意図したとおりに機能を使用できます。

例:

関数スクリプト-C:\ Python27にfunction_choose.pyとして保存

def choose(a):
  from random import randint
  b = randint(0, len(a) - 1)
  c = a[b]
  return(c)

関数を使用したスクリプト-どこにでも保存

from function_choose import choose
list_a = ["dog", "cat", "chicken"]
print(choose(list_a))

出力は犬、猫、ORチキン

これが役に立てば、ダウンロード用のファンクションパックを作成できるようになりました。

--------------------------------これはPython 2.7 ------- ------------------------------

4
James Hood

最初に、両方のファイルが同じ作業ディレクトリにあるかどうかを確認する必要があります。次に、ファイル全体をインポートできます。例えば、

import myClass

または、クラス全体と関数全体をファイルからインポートできます。例えば、

from myClass import

最後に、元のファイルからクラスのインスタンスを作成し、インスタンスオブジェクトを呼び出す必要があります。

動作していないコード(「他の」ファイルから)を含めると本当に役立ちますが、「eval」関数の健康的な量であなたがやりたいことができると思います。

例えば:

def run():
    print "this does nothing"

def chooser():
    return "run"

def main():
    '''works just like:
    run()'''
    eval(chooser())()

チューザは実行する関数の名前を返し、evalは文字列をインプレースで実行される実際のコードに変換し、括弧は関数呼び出しを終了します。

0
mikebabcock