说我有一个班级和一个职能:
class AddressValidator(self):
def __init__(self):
pass
def validate(address):
# ...
def validate_address(addr):
validator = AddressValidator()
return validator.validate(addr)
如果愿意,该函数是使用该类的快捷方式。现在,如果这个功能必须运行数千次呢?如果验证器类实际上必须在实例化上做一些事情,比如连接到数据库,那么一遍又一遍地创建它是非常浪费的。我想知道我是否可以这样做:
def validate_address(addr):
if not hasattr(validate_address, 'validator'):
validate_address.validator = AddressValidator()
validator = validate_address.validator
return validator.validate(addr)
现在验证器类只被实例化一次并保存在“函数”中,就这样说了。我从来没有见过这样做,所以我猜这是不好的做法。如果是这样,为什么?
注意:我知道我可以在全局模块中缓存验证器对象。我只是好奇,如果我想避免乱丢我的模块,这是一个可行的解决方案。
答案 0 :(得分:3)
我使用默认参数(在函数定义时计算一次并绑定到函数):
def validate_address(addr, validator=AddressValidator())
return validator.validate(addr)
如果AddressValidator
的实例被认为是不可变的(即它们不包含修改其内部状态的方法),这是完全可以接受的,并且如果您发现需要,它还允许您稍后覆盖验证器的选择(例如,提供专门针对特定国家的验证器)。
答案 1 :(得分:3)
尽管“永远是一个对象”,但并不像工作良好的班级一样好的工作。 这个问题看起来像在python中调用的“functor”或“callable object”的典型情况。
代码看起来像
class AddressValidator(self):
def __init__(self):
pass
def __call__(self,address):
# ...
validate_address = AdressValidator()
或者您可以将函数定义为绑定方法的快捷方式
class AddressValidator(self):
def __init__(self):
pass
def validate(self,address):
# ...
validate_adress = AdressValidator().validate