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

什么';检查Python中是否设置了类实例变量的最佳方法是什么?,python,Python,我有一个变量,它可能在实例中获取值,也可能不获取值: class EC(): __init__(self, a=False): ... if a: self.__var = ... 稍后我想检查实例中是否存在\uu var。由于在名称前加上\uuu将内部名称更改为\u EC\u_var,检查代码变得有点混乱: if ''.join(['_',self.__class__.__name__,'__name']) in self.__dict__: ... 是否认为代码高于正常

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

class EC():
   __init__(self, a=False):
   ...
   if a: self.__var = ...
稍后我想检查实例中是否存在\uu var。由于在名称前加上\uuu将内部名称更改为\u EC\u_var,检查代码变得有点混乱:

if ''.join(['_',self.__class__.__name__,'__name']) in self.__dict__: ...
是否认为代码高于正常值?如果不是,首选的备选方案是什么?

我能想到的一个选择是无论如何给\uu var一些值,例如:

_no_value = object()
...
   def __init__(self, a):
      self.__var = _no_value
      ...
      if a: self.__var = ...
因此,稍后我可以将\u var\u no\u value进行比较,而不是将内部变量搞得一团糟。

只需使用hasattr(self,'u var')来查看它是否存在-它可能被设置为无,但如果hasattr说它存在,它就会存在

例如:


只需在类中将其设置为
None

然后,如果self.\u var不是None,则测试

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

_sentinel = object()

 class EC():
    __var = _sentinel

    __init__(self, a=False):
        ...
        if a: self.__var = ...
如果self.\u var不是哨兵,则测试

这样,所有对
\uu var
的引用都会被正确重写,以包含类名

另一种方法是不要对属性使用双下划线名称<代码>\uuu var
只应用于您希望将名称空间指定给特定类的属性,这样子类就不会意外地用自己的属性将其重击

换句话说,不要使用双下划线名称,除非您真正理解它们的用途并且确实需要它。任何不属于未知第三方广泛使用的框架的代码?只需使用单下划线即可。

您已经忘记了:

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

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

我想有一个简单的方法来检查这一点。我就是这样试的

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.\uu dict\uu
的内容。只需键入:
print(self.\u dict\uuuuuuuuu)
上述代码的输出如下所示:

{'a': '123', 'b': 'asd', 'c': True, 'd': 'The variable exists'}
所有实例变量都以字典格式存储在self中。dict


我在Python3.8.1和Python2.6.6中尝试了这一点。它成功了。如果对答案有任何误解,请通过注释报告。

请查看函数。我已经尝试过了,它也有相同的问题(python 2.6.6)。我必须使用getattr(self,'.'u EC'u'u var'),这对单下划线有效,但对双下划线无效。我认为您没有正确阅读这个问题,或者理解Python对类上的双下划线属性做了什么。不,没有那么简单。正如你从我的扩展答案中看到的,它在这里可以很好地使用单下划线和双下划线;它们被视为神奇的方法。每天学习一些新的东西-我想说两点-1)如果你需要从外部访问属性,最好不要以一种神奇的方式命名它,特别是为了保持它的私密性,最好不要这样做2)如果你绝对必须使用这种命名方式按照惯例,使用重写
\uuu getattr\uuuu
的类可能会更好、更清晰,如中所述
t = Test('123', 'asd', True)
The variable exists
{'a': '123', 'b': 'asd', 'c': True, 'd': 'The variable exists'}