做网站图片链接到天猫,学室内设计就是失业,关键词提取工具,装修公司报价明细表范本文章目录1. 序列__getitem__2. __setitem__3. 抽象基类4. 不要直接子类化内置类型5. 继承顺序6. 重载运算符learn from 《流畅的python》
1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法#xff0c; Python 会调用 __getitem__ 方法#xff0c; 设法让 迭代 和…
文章目录1. 序列__getitem__2. __setitem__3. 抽象基类4. 不要直接子类化内置类型5. 继承顺序6. 重载运算符learn from 《流畅的python》
1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法 Python 会调用 __getitem__ 方法 设法让 迭代 和 in 运算符可用 class Foo:def __getitem__(self, pos):return range(0, 30, 10)[pos]f Foo()
print(f[1]) # 10
for i in f:print(i) # 0, 10, 20
# 如果没有 __iter__ 和 __contains__ 方法
# Python 会调用 __getitem__ 方法
# 设法让迭代和 in 运算符可用2. __setitem__
import collectionsCard collections.namedtuple(Card, [rank, suit])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 suit in self.suits for rank in self.ranks]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]def __str__(self):return ,.join(str(i) for i in self._cards)from random import shuffledeck FrenchDeck()
print(str(deck))
# Card(rank2, suitspades),Card(rank3, suitspades),Card(rank4, suitspades),Card(rank5, suitspades),Card(rank6, suitspades),Card(rank7, suitspades),Card(rank8, suitspades),Card(rank9, suitspades),Card(rank10, suitspades),Card(rankJ, suitspades),Card(rankQ, suitspades),Card(rankK, suitspades),Card(rankA, suitspades),Card(rank2, suitdiamonds),Card(rank3, suitdiamonds),Card(rank4, suitdiamonds),Card(rank5, suitdiamonds),Card(rank6, suitdiamonds),Card(rank7, suitdiamonds),Card(rank8, suitdiamonds),Card(rank9, suitdiamonds),Card(rank10, suitdiamonds),Card(rankJ, suitdiamonds),Card(rankQ, suitdiamonds),Card(rankK, suitdiamonds),Card(rankA, suitdiamonds),Card(rank2, suitclubs),Card(rank3, suitclubs),Card(rank4, suitclubs),Card(rank5, suitclubs),Card(rank6, suitclubs),Card(rank7, suitclubs),Card(rank8, suitclubs),Card(rank9, suitclubs),Card(rank10, suitclubs),Card(rankJ, suitclubs),Card(rankQ, suitclubs),Card(rankK, suitclubs),Card(rankA, suitclubs),Card(rank2, suithearts),Card(rank3, suithearts),Card(rank4, suithearts),Card(rank5, suithearts),Card(rank6, suithearts),Card(rank7, suithearts),Card(rank8, suithearts),Card(rank9, suithearts),Card(rank10, suithearts),Card(rankJ, suithearts),Card(rankQ, suithearts),Card(rankK, suithearts),Card(rankA, suithearts)
shuffle(deck) # TypeError: FrenchDeck object does not support item assignment加入__setitem__ def __setitem__(self, key, value):self._cards[key] valueshuffle(deck)
print(str(deck))
# 牌被随机打乱了
# Card(rank6, suithearts),Card(rank2, suitspades),Card(rank3, suithearts),Card(rankA, suitclubs),Card(rank7, suitclubs),Card(rankQ, suitdiamonds),Card(rank5, suithearts),Card(rank6, suitspades),Card(rank5, suitdiamonds),Card(rank8, suitdiamonds),Card(rankK, suithearts),Card(rankQ, suithearts),Card(rank8, suithearts),Card(rank3, suitdiamonds),Card(rankQ, suitclubs),Card(rankA, suitdiamonds),Card(rank9, suithearts),Card(rank7, suitdiamonds),Card(rankA, suitspades),Card(rankJ, suithearts),Card(rank3, suitclubs),Card(rank4, suithearts),Card(rankQ, suitspades),Card(rank10, suitdiamonds),Card(rank10, suithearts),Card(rankK, suitdiamonds),Card(rank2, suitdiamonds),Card(rank4, suitspades),Card(rank3, suitspades),Card(rank7, suithearts),Card(rank9, suitclubs),Card(rankJ, suitclubs),Card(rankJ, suitdiamonds),Card(rank10, suitspades),Card(rank4, suitdiamonds),Card(rank7, suitspades),Card(rank9, suitdiamonds),Card(rank2, suithearts),Card(rank6, suitclubs),Card(rankK, suitclubs),Card(rank4, suitclubs),Card(rankA, suithearts),Card(rankK, suitspades),Card(rank2, suitclubs),Card(rankJ, suitspades),Card(rank8, suitspades),Card(rank5, suitspades),Card(rank9, suitspades),Card(rank10, suitclubs),Card(rank8, suitclubs),Card(rank6, suitdiamonds),Card(rank5, suitclubs)或者 在类外打补丁 FrenchDeck.__setitem__ 函数
def set_card(deck, position, card):deck._cards[position] cardFrenchDeck.__setitem__ set_card3. 抽象基类
class Test:def __len__(self):return 24from collections import abcprint(isinstance(Test(), abc.Sized)) # True只要实现了 __len__() 方法就可以被 abc.Sized 识别为子类
4. 不要直接子类化内置类型
class AnswerDict(dict):def __getitem__(self, key):return 24ad AnswerDict(agood)
print(ad[a]) # 24
d {}
d.update(ad)
print(d[a]) # good
print(ad) # {a: good}
print(d) # {a: good}直接子类化内置类型如 dict、list 或 str容易出错 因为 内置类型的方法 通常会 忽略用户覆盖的方法。 不要子类化内置 类型用户自己定义的类 应该继承 collections 模块 中的类例如 UserDict、UserList 和 UserString这些类做了特殊设计因 此易于扩展
import collectionsclass AnswerDict2(collections.UserDict):def __getitem__(self, key):return 24
ad AnswerDict2(agood)
print(ad[a]) # 24
d {}
d.update(ad)
print(d[a]) # 24
print(ad) # {a: good}
print(d) # {a: 24}5. 继承顺序
多重继承的同名方法调用根据类的 __mro__ 属性顺次在类中查找推荐使用 super() 函数
6. 重载运算符 不可变类型一定不能实现就地特殊方法 __iadd__等增量赋值特殊方法 必须返回 self