簡體   English   中英

檢查類實例變量是否在 Python 中設置的最佳方法是什么?

[英]What's the best way to check if class instance variable is set in 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進行比較,而不是將內部變量弄得一團糟。

你忘記了EAFP 原則

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

如果您決定使用哨兵,則可以將其與類變量結合使用:

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

只需使用 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
>>>

只需在課堂上將其設置為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應該只用於您希望命名空間到特定類的屬性,以便子類不會意外地用自己的屬性破壞它。

換句話說,不要使用雙下划線名稱,除非您真的了解它們的用途並且確實需要它。 任何不屬於未知第三方更廣泛使用的框架的一部分的代碼? 只需堅持使用單個下划線。

我想有一個簡單的方法來檢查這個。 這是我試過的方法。

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 中嘗試了這個。 它成功了。 如果對答案有任何誤解,請通過評論反饋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM