我有一个我想要参数化的模块,或者我想从一个对象导入函数。
这是我希望能够在我从中导入内容之前给它改变其行为的参数。
一种方法是将我的模块作为对象并使用这些函数。目前我这样做:
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
这样的事情可能吗?我可以从基础模块继承吗?如果我添加对用户来说应该看起来很明显的约束怎么样呢?
答案 0 :(得分: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
答案 1 :(得分:0)
您可以动态创建模块,然后导入它。
http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/
虽然,我的建议是使用一个班级。
答案 2 :(得分: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__})