我使用类变量来替换避免使用全局变量,但我认为它不是pythonic方式,任何人都可以给我一个更好的方法吗?
类变量方式:
class A(object):
_func_map=dynamic_load_from_module()
_ad_map = dynamic_load_from_another_module()
@classmethod
def check_status(cls,host,port,user):
#do something other
return cls._func_map[user].verify()
@classmethod
def check_ad(cls,host,port,user):
#do something other
return cls._ad_map[user].check()
全局变量方式:
_global_func_map = dynamic_load_from_module()
_global_ad_map = dynamic_load_from_another_module()
def check_status(host,port,user):
#do something other
global _global_func_map
return _global_func_map[user].verify()
def check_ad(host,port,user):
#do something other
global _ad_map
return _ad_map[user].check()
答案 0 :(得分:1)
我想最pythonic的方式是一个模块:
#!/usr/env/bin/python
def dynamic_load_from_module(): pass
def dynamic_load_from_another_module(): pass
fun_map = dynamic_load_from_module()
ad_map = dynamic_load_from_another_module()
所以你像模块一样使用它:
from module import fun_map, ad_map
class Foo(object):
@classmethod
def check_ad(cls,host,port,user):
return ad_map[user].check()
但是如果你需要在构造实例时调用它们,你可能想要做类似
的事情#!/usr/env/bin/python
def dynamic_load_from_module(): pass
def dynamic_load_from_another_module(): pass
(所以你只需在模块中定义函数)
from module import dynamic_load_from_module, dynamic_load_from_another_module
class Foo(object):
def __init__(self):
self._fun_map = dynamic_load_from_module()
self._ad_map = dynamic_load_from_another_module()
或者,如果您需要在构造实例时调用它们,但仍然是类'属性:
from module import dynamic_load_from_module, dynamic_load_from_another_module
class Foo(object):
_fun_map = dynamic_load_from_module()
_ad_map = dynamic_load_from_another_module()
还有很多其他方法(属性,类方法,静态方法等),但我非常确定该模块是最蟒蛇的。此外,它很容易设置,阅读和理解 - 所以为什么不呢。