从另一个文件中的类导入函数?

Posted

技术标签:

【中文标题】从另一个文件中的类导入函数?【英文标题】:Importing a function from a class in another file? 【发布时间】:2011-10-09 02:08:07 【问题描述】:

我正在编写一个 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()

【问题讨论】:

请显示其他文件中的内容。你读过this吗? 这甚至不应该解析——你的缩进是错误的,甚至不同地方的大小写也不同。 它运行,我从 textmate 复制时错误地添加了几个缩进。在上次编辑中修复它 【参考方案1】:
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 __name__ == '__main__':
    a_game = Comm_system()
    a_game.run()

正是那些一直在运行的行导致它在导入和执行时都运行。

【讨论】:

所以我必须在原始文件(侏罗纪公园大型机)中放置一个类的实例?知道了,我试试看…… 顺便说一句,请原谅这个程序的极客主题,我真的想不出还有什么可做的 查看我的编辑——如果是直接执行的,您只需执行模块的最后两行。 哦,非常好。它执行我想要的“Jpark_mainframe”功能。但是,它不会从 Comm_system 类返回 run() 函数。 返回你有return Comm_system.run的运行函数?如果您希望运行函数的 OUTPUT 或 return Comm_system().run 如果您希望函数本身稍后使用,请去掉 exit(0) 并将 return Comm_system.run 替换为 return Comm_system().run()。您需要Comm_system() 而不是Comm_system,因为您需要的是类的实例,而不是类本身,就像您当前编写类的方式一样。【参考方案2】:
from FOLDER_NAME import FILENAME
from FILENAME import CLASS_NAME FUNCTION_NAME

FILENAME 没有后缀

【讨论】:

【参考方案3】:

首先,您需要确定您的两个文件是否在同一个工作目录中。接下来,您可以导入整个文件。例如,

import myClass

或者您可以从文件中导入整个类和整个函数。例如,

from myClass import

最后,您需要从原始文件创建类的实例并调用实例对象。

【讨论】:

【参考方案4】:

如果像我一样,你想制作一个功能包或人们可以下载的东西,那么这很简单。只需将您的函数写入 python 文件并将其保存为您想要的名称在您的 Python 目录中。现在,在要使用它的脚本中,输入:

from FILE NAME import FUNCTION NAME

注意 - 大写字母部分是您输入文件名和函数名的位置。

现在你只是使用你的函数,不管它是什么意思。

例子:

FUNCTION SCRIPT - 保存在 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))

输出将是狗、猫或鸡

希望对您有所帮助,现在您可以创建功能包以供下载!

--------------------------------这是针对 Python 2.7 的---------- --------------------------

【讨论】:

【参考方案5】:

如果您包含不起作用的代码(来自“其他”文件),这将非常有帮助,但我怀疑您可以使用健康剂量的“eval”函数来做您想做的事情。

例如:

def run():
    print "this does nothing"

def chooser():
    return "run"

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

选择器返回要执行的函数的名称,然后 eval 将字符串转换为要就地执行的实际代码,括号结束函数调用。

【讨论】:

你有一个额外的单引号使你的程序出现语法错误。另外,我认为他的工作不需要eval,如果您正确解释他的问题,可能只需要getattr(module_or_class, chooser()) 我能想出六种方法来做我认为他想做的事,其中一些比其他的不那么蟒蛇式。然而,'eval' 非常容易使用,尽管有时非常危险。他很可能只需要将一个类的实例返回到另一个文件并按照您的建议从那里运行该函数。更多细节会很棒。【参考方案6】:

您可以使用以下语法 -

from FolderName.FileName import Classname

【讨论】:

以上是关于从另一个文件中的类导入函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 SASS 中是不是可以从另一个文件中的类继承?

使用 Python 3 从另一个目录中的模块导入本地函数,并在 Jupyter Notebook 中进行相对导入

将文件中的函数导入 Symfony 中的类控制器的问题

从模块导入的 Webpack 类不是构造函数

Python 导入其他文件中的类

从另一个文档导入 SVG 元素,而不会丢失原始文件中的 CSS <style>