[英]What is the correct (or best) way to subclass the Python set class, adding a new instance variable?
[英]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.