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

2024-04-27 01:02:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个模块,我想参数化,或者更确切地说,我想从一个对象导入函数。在

也就是说,我希望能够给它一些参数,在我从它导入东西之前,可以改变它的行为。在

一种方法是使我的模块成为一个对象,并且只使用那些函数。目前我这样做:

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!"]。在

然而,你拥有的功能越多,这就越不好用了。在

我希望能够这样做:

^{pr2}$

这样的事有可能吗?我可以从基模块继承吗?如果我加上一个约束,即它应该对用户来说是显而易见的,那又如何呢?在


Tags: 模块对象方法函数noselfmod参数
3条回答

如果唯一的问题是:

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

比以下内容更详细:

^{pr2}$

更好的解决方案可能只是以编程方式进行导入:

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

或者:

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

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

  • 它们是单例的,这意味着您将永远只拥有其中一个,无论您导入多少个位置

  • 不能传递参数

  • 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

您可以动态创建模块,然后导入它。在

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

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

相关问题 更多 >