3

假设我有一个类和一个函数:

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)

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

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

4

2 回答 2

3

我会使用默认参数(在函数定义时评估一次并绑定到函数):

def validate_address(addr, validator=AddressValidator())
    return validator.validate(addr)

如果 的实例AddressValidator被认为是不可变的(即它们不包含修改其内部状态的方法),这是完全可以接受的,并且它还允许您稍后在发现需要时覆盖验证器的选择(例如,提供专门的验证器特定国家)。

于 2012-09-18T05:52:43.547 回答
3

尽管“一切都是对象”,但一切都不像受良好控制的类的实例那么好。这个问题看起来像是在 python 中调用的“函子”或“可调用对象”的典型情况。

代码看起来像

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
于 2012-09-18T06:04:36.223 回答