Python中的参数模块?从对象中导入函数

3 投票
3 回答
554 浏览
提问于 2025-04-17 14:53

我有一个模块,我想让它可以根据不同的参数来改变行为,或者说我想从一个对象中导入一些函数。

也就是说,我希望在导入这些函数之前,可以给它传递一些参数,这样它的行为就会有所不同。

一种方法是把我的模块变成一个对象,然后直接使用里面的函数。目前我这样做:

class MyModule(object):
    def __init__(self, previous_sayings):
        self.sayings = previous_sayings
    __all__ = ['sayhi']
    def sayhi(self):
        self.sayings.append("hi!")

mod = MyModule(["oh no!"])
sayhi = mod.sayhi
sayhi()
sayhi()
print mod.sayings

这样应该会打印出 ["oh no!", "hi!", "hi!"]

不过,如果函数的数量越来越多,这种方式就不太好用了。

我希望能够做到类似这样的事情:

mod = MyModule(["oh no!"])
from mod import * 
sayhi()
sayhi()

print mod.sayings

有没有可能实现这样的功能?我能否从一个基础模块继承?如果我还要求用户能很明显地看出发生了什么,那该怎么做呢?

3 个回答

0

如果唯一的问题是:

sayhi=mod.sayhi()
saybye=mod.saybye()
# … 40 more functions

这个写法比:

from mod import sayhi, saybye, # … 40 more functions

要啰嗦很多。

一个更好的解决办法可能就是通过编程的方式来导入:

for name in mod.__all__:
    locals[name] = getattr(mod, name)

或者:

locals.update({name: getattr(mod, name) for name in mod.__all__})
0

你可以动态地创建你的模块,然后再导入它。

http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/

不过,我的建议是使用一个类。

2

关于模块,有几个要点需要了解:

  • 模块是单例的,这意味着无论你在多少地方导入它,你只会有一个模块的实例。

  • 你不能给模块传递参数。

  • from <module> import *这种写法是危险的,不是个好习惯,应该只在那些专门设计成这样使用的模块中使用。

  • 在一个模块中定义的所有函数、类等,都会把这个模块视为它们的全局命名空间。

你可以得到一些类似你想要的东西:

8<--mod.py------------------------------------------------------
sayings = []
def sayhi():
    sayings.append("Hi!")
8<--------------------------------------------------------------

import mod
mod.sayings = ['oh no!']   # or mod.sayings.append('oh no')
from mod import sayhi
sayhi()
sayhi()
print mod.sayings

撰写回答