将东西放入新的函数属性是不好的做法?

时间:2012-09-18 05:48:24

标签: python

说我有一个班级和一个职能:

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)

现在验证器类只被实例化一次并保存在“函数”中,就这样说了。我从来没有见过这样做,所以我猜这是不好的做法。如果是这样,为什么?

注意:我知道我可以在全局模块中缓存验证器对象。我只是好奇,如果我想避免乱丢我的模块,这是一个可行的解决方案。

2 个答案:

答案 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