如何在Python脚本中直接导入代码?

1 投票
3 回答
732 浏览
提问于 2025-04-16 07:42

我正在开发一个PyQT4的应用程序,但一次性浏览所有代码让我觉得有点困难。我知道有个import foo的语句,但我不知道怎么能像BASH里的source foo那样,直接把一段代码引入到我的脚本中。

我想这样做:

# File 'functions.py'

class foo(asd.fgh):
  def __init__(self):
    print 'foo'

这是第二个文件。

# File 'main.py'

import functions

class foo(asd.fgh):
  def qwerty(self):
    print 'qwerty'

我想把两个不同文件中的代码或者类的声明合并在一起。在PHP中,有import_once('foo.php'),而在BASH中有source 'foo.sh',那么在Python中我能做到这一点吗?

谢谢!

3 个回答

0

在Python中,猴子补丁的工作方式和其他语言不太一样。通常来说,这种做法被认为是不太好的,但如果你还是想这么做,可以这样操作:

# File 'functions.py'

class foo(asd.fgh):
  def __init__(self):
    print 'foo'

被导入的模块不会改变。在导入模块的地方,我们的做法会有些不同。

# File 'main.py'

import functions

def qwerty(self):
  print 'qwerty'

functions.foo.qwerty = qwerty

注意,这里没有额外的类定义,只有一个简单的函数。然后我们把这个函数作为类的一个属性添加进去。

3

你需要用到 execfile() 这个函数。不过其实你并不需要,因为重新定义一个类,嗯……就是重新定义它。

4

不知道为什么,我第一反应是多重继承。但为什么不试试普通的继承呢?

class foo(functions.foo):
    # All of the methods that you want to add go here.

有没有什么原因让这个方法行不通呢?


既然你只是想合并类的定义,那为什么不这样做呢:

# main.py
import functions

# All of the old stuff that was in main.foo is now in this class
class fooBase(asd.fgh):
    def qwerty(self):
        print 'qwerty'

# Now create a class that has methods and attributes of both classes
class foo(FooBase, functions.foo): # Methods from FooBase take precedence
    pass

或者

class foo(functions.foo, FooBase): # Methods from functions.foo take precedence      
    pass

这个方法利用了Python支持多重继承的特性,可以创建一个新类,里面包含了两个来源的功能。

撰写回答