在Python中,如何从其他模块访问在主模块中创建的实例?

时间:2016-03-27 18:55:19

标签: python

我对OOP和Python并不了解......

以下是关于我的问题的示例:

我的主模块中有一个类对象

# main.py
#---------

class MyRobot():

    def __init__(self):
        self.move = 0

    def walk(self):
        self.move += 5

    def botInfo(self):
        # In my case,
        # I can only address track.howFar to my main module
        import track
        getInfo = track.howFar
        print getInfo()


if __name__ == '__main__':
    bot = MyRobot()
    bot.walk()
    bot.botCMD()

并有另一个模块

# track.py
#---------
def howFar():
    return bot.move # How??

我需要从move

获取bot对象中的track.py

这可能吗?

我该怎么办?

---- -----更新

我知道这个例子的情况真的很奇怪......

其实我正在研究python-telegram-bot的commandHandler,

请原谅我跳过很多细节,

因为我认为我的问题与telegram自我问题没有关联。

如果我浪费你的时间,我道歉......

3 个答案:

答案 0 :(得分:0)

正如jonrsharpe在评论中所提到的,以下内容将引发ImportError

from main import bot

相反,我们必须导入类然后在新文件中创建对象。

from main import myRobot

bot = myRobot()    

def howFar():
    return bot.move

print(howFar())

<强>输出

0

答案 1 :(得分:0)

import main
bot = main.myRobot() # bot.move
from main import myRobot
bot = myRobot() # bot.move
def howFar(robot_instance):
    return robot_instance.move

howFar(bot) # passing instance

答案 2 :(得分:0)

第一部分是从main.py移动class myRobotrobot.py(或myrobot.py)。

接下来将取决于你的程序是如何编写的。不太理想的是将robot.py中的class myRobot实例分配给一个全局变量,然后可以从导入该模块的所有内容中获取该变量。

也许第二个不太理想的是拥有像

这样的类变量
class myRobot():
    _my_robot = None

    @classmethod
    def MakeRobot(cls):
        if cls._my_robot is None:
            cls._my_robot = cls() #cls is `class myRoboto`

        return cls._my_robot
从那里你可以调用myRobot.MakeRobot()一次来创建一个新实例,然后对MakeRobot()的任何后续调用将返回相同的实例。

更理想的解决方案,在脚本的实际主要功能中,创建一个myRobot实例并将其传递到需要它的地方。

def run_program():
    robot = myRobot()

    while True: #or however your script runs
        #do robot move logic
        howFar(robot)

不相关,我建议总是按照惯例大写字母名称,告诉其他人MyRobot是一个类,而myRobotmy_robot是一个变量。