3

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

那就是我希望能够在我从中导入东西之前给它提供改变其行为的参数。

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

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

这样的事情可能吗?我可以从基本模块继承吗?如果我添加对用户来说应该很明显的约束怎么办?

4

3 回答 3

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
于 2013-02-06T00:52:21.407 回答
0

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

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

虽然,我的建议是使用一个类。

于 2013-02-06T00:43:29.523 回答
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__})
于 2013-02-06T01:16:27.907 回答