Python 数据模型:覆盖特殊方法 "contains"
Python Data Model : Overriding special method "contains"
所以我试图通过 "Fluent Python" 书更好地理解 python。在 python 数据模型中,作者描述了如何为 类.
定义特殊方法
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank,suit) for rank in self.ranks
for suit in self.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self,position):
return self._cards[position]
def __contains__(self,*args):
return "Contains has been overridden"
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
运行 上面的代码给了我以下结果,而我希望它说 "Contains has been overridden"
True
为什么我不能覆盖包含?
我认为你的情况是多种因素的结合:
- .__contains__() 预计 return 对或错
- Membership test operations 评估为 True 或 False
- 在truth value testing、"Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true[…]"
因此,由于您 return 编辑了一个非空字符串,因此它被评估为 True 值。如果将其更改为空字符串,则其值为 False。这是一个例子:
import dataclasses
@dataclasses.dataclass
class Card:
rank: str
suit: str
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for rank in self.ranks
for suit in self.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def __contains__(self, item):
return ""
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
但是不要像您在这里所做的那样试图从根本上改变魔术方法的含义。它会混淆其他人(包括你未来的自己)
所以我试图通过 "Fluent Python" 书更好地理解 python。在 python 数据模型中,作者描述了如何为 类.
定义特殊方法class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank,suit) for rank in self.ranks
for suit in self.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self,position):
return self._cards[position]
def __contains__(self,*args):
return "Contains has been overridden"
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
运行 上面的代码给了我以下结果,而我希望它说 "Contains has been overridden"
True
为什么我不能覆盖包含?
我认为你的情况是多种因素的结合:
- .__contains__() 预计 return 对或错
- Membership test operations 评估为 True 或 False
- 在truth value testing、"Operations and built-in functions that have a Boolean result always return 0 or False for false and 1 or True for true[…]"
因此,由于您 return 编辑了一个非空字符串,因此它被评估为 True 值。如果将其更改为空字符串,则其值为 False。这是一个例子:
import dataclasses
@dataclasses.dataclass
class Card:
rank: str
suit: str
class FrenchDeck:
ranks = [str(n) for n in range(2,11)] + list('JQKA')
suits = 'spades diamonds clubs hearts'.split()
def __init__(self):
self._cards = [Card(rank, suit) for rank in self.ranks
for suit in self.suits]
def __len__(self):
return len(self._cards)
def __getitem__(self, position):
return self._cards[position]
def __contains__(self, item):
return ""
deck = FrenchDeck()
print(Card('Q','hearts') in deck)
但是不要像您在这里所做的那样试图从根本上改变魔术方法的含义。它会混淆其他人(包括你未来的自己)