检查是否在Python中设置类实例变量的最佳方法是什么?

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


在课堂上设置为None

1
2
3
4
5
6
 class EC():
    __var = None

    __init__(self, a=False):
        ...
        if a: self.__var = ...

然后测试if self.__var is not None

如果None应该是属性的有效值,请使用不同的singleton sentinel:

1
2
3
4
5
6
7
8
_sentinel = object()

 class EC():
    __var = _sentinel

    __init__(self, a=False):
        ...
        if a: self.__var = ...

if self.__var is not _sentinel进行检测。

这样,所有对__var的引用都会被适当地重写,以包含类名。

另一个路径是不要为属性使用双下划线名称。__var只应用于要为特定类命名的属性,这样子类就不会意外地用它们自己的属性来破坏它。

换句话说,不要使用双下划线名称,除非您真正了解它们的用途和实际需要。任何不属于未知第三方更广泛消费框架的代码?只需使用单个下划线。