What's the best way to check if class instance variable is set in Python?
我有一个变量,该变量可能在实例中获取值,也可能不获取值:
1 2 3 4 | class EC(): __init__(self, a=False): ... if a: self.__var = ... |
稍后,我想检查实例中是否存在_uuu变量。由于名称的前置将内部名称改为变量,检查代码变得有点混乱:
1 | if ''.join(['_',self.__class__.__name__,'__name']) in self.__dict__: ... |
代码是否高于正常值?如果不是,首选的替代方案是什么?
我能想到的一个选择是无论如何给uuuvar一些值,例如:
1 2 3 4 5 6 | _no_value = object() ... def __init__(self, a): self.__var = _no_value ... if a: self.__var = ... |
因此,稍后我可以将uuvar与no_值进行比较,而不是将内部变量搞得一团糟。
您已经忘记了EAFP原则:
1 2 3 4 | try: value = self.__var except AttributeError: # do something else |
如果决定使用sentinel,可以将其与类变量组合:
1 2 3 4 5 | class EC(): __var = object(): ... if self.__var is not EC.__var: ... |
只需使用hasattr(self,"uvar")查看它是否存在——它可能被设置为无,但如果hasattr说它存在,它将存在。
例如。:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | >>> class a(): ... def __init__(self): ... self.a = 3 ... self._a_ = 4 ... self.__a__ = 'Fred' ... >>> A=a() >>> hasattr(a, 'a') False >>> hasattr(A, 'a') True >>> hasattr(A, '_a_') True >>> hasattr(A, '__a__') True >>> hasattr(A, '__b__') False >>> |
在课堂上设置为
1 2 3 4 5 6 | class EC(): __var = None __init__(self, a=False): ... if a: self.__var = ... |
然后测试
如果
1 2 3 4 5 6 7 8 | _sentinel = object() class EC(): __var = _sentinel __init__(self, a=False): ... if a: self.__var = ... |
对
这样,所有对
另一个路径是不要为属性使用双下划线名称。
换句话说,不要使用双下划线名称,除非您真正了解它们的用途和实际需要。任何不属于未知第三方更广泛消费框架的代码?只需使用单个下划线。