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

时间:2013-08-01 14:15:55

标签: python

我有一个变量,可能会或可能不会在实例中获取值:

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

稍后我想检查实例中是否存在 __ var 。由于将 __ 添加到名称会将内部名称更改为 _EC__var ,因此检查代码会变得有点混乱:

if ''.join(['_',self.__class__.__name__,'__name']) in self.__dict__: ...

以上代码是否正常?如果不是首选的替代品?

我能想到的一个选择是给 __ var 一些值,例如:

_no_value = object()
...
   def __init__(self, a):
      self.__var = _no_value
      ...
      if a: self.__var = ...

所以稍后我可以将 __ var _no_value 进行比较,而不是将内部变量搞得一团糟。

4 个答案:

答案 0 :(得分:6)

您忘记了EAFP principle

try:
    value = self.__var
except AttributeError:
    # do something else

如果您决定使用哨兵,可以将其与类变量结合使用:

class EC():
    __var = object():
    ...
    if self.__var is not EC.__var:
        ...

答案 1 :(得分:4)

只需使用hasattr(self,'_ var')来查看它是否存在 - 它可以设置为None但是如果hasattr说它会存在它。

E.g:

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

答案 2 :(得分:2)

只需在课程上将其设为None

 class EC():
    __var = None

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

然后测试if self.__var is not None

如果None应该是该属性的有效值,请使用不同的单例哨兵:

_sentinel = object()

 class EC():
    __var = _sentinel

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

并测试if self.__var is not _sentinel

这样,__var的所有引用都被正确地重写以包含类名。

另一条路径是不为您的属性使用双下划线名称。 __var只应用于您想要命名为特定类的属性,以便子类不会意外地用自己的属性破坏它。

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

答案 3 :(得分:1)

我想这里有一种简单的方法可以检查出来。这是我尝试的方式。

class Test:

    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

        if self.c:
            self.d = "The variable exists"
        if 'd' in self.__dict__:
            print(self.d)

现在实例化上面的类:

t = Test('123', 'asd', True)

上面的代码输出类似:

The variable exists

如果要查看self.__dict__的内容。只需输入:print(self.__dict__) 上面代码的输出如下:

{'a': '123', 'b': 'asd', 'c': True, 'd': 'The variable exists'}

所有实例变量都以字典格式存储在self中。字典

我在python 3.8.1和python 2.6.6中进行了尝试。它解决了。如果对答案有任何误解,请通过评论报告。