我有一个变量,可能会或可能不会在实例中获取值:
class EC():
__init__(self, a=False):
...
if a: self.__var = ...
Run Code Online (Sandbox Code Playgroud)
后来我想检查实例中是否存在__var.因为在名称前加上__会将内部名称更改为_EC__var,所以检查代码会变得有点乱:
if ''.join(['_',self.__class__.__name__,'__name']) in self.__dict__: ...
Run Code Online (Sandbox Code Playgroud)
上面的代码是否正常?如果不是什么是首选的替代品?
我能想到的一个选择是给__var一些值,例如:
_no_value = object()
...
def __init__(self, a):
self.__var = _no_value
...
if a: self.__var = ...
Run Code Online (Sandbox Code Playgroud)
所以稍后我可以将__var与_no_value进行比较,而不是将内部变量弄得乱七八糟.
Ste*_*nes 10
只需使用 hasattr(self, '_var') 来查看它是否存在——它可能被设置为 None 但如果 hasattr 说它存在,它就会存在。
例如:
>>> 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
>>>
Run Code Online (Sandbox Code Playgroud)
您忘记了EAFP原则:
try:
value = self.__var
except AttributeError:
# do something else
Run Code Online (Sandbox Code Playgroud)
如果您决定使用哨兵,可以将其与类变量结合使用:
class EC():
__var = object():
...
if self.__var is not EC.__var:
...
Run Code Online (Sandbox Code Playgroud)