Fluent Python Chapter 1

Python 解释器遇到特殊的句法时会用特殊方法激活一些基本对象操作。这些特殊方法与__getitem__同格式,比如obj[key]用的就是__getitem__方法,为了求得my_collection[key]的值,解释器实际上会调用my_collection.getitem(key)。

这些特殊方法能让对象实现和支持对应的语言架构并与之交互。(如属性访问,迭代,函数和方法的调用等)

1.1 Python 风格纸牌

知识补充:

  1. class collection:
    1.nameturple
    在这里插入图片描述
    等于对一个列表进行命名。
    2.在这里插入图片描述

2.方法__getitem__
魔法方法__getitem__ 可以让对象实现迭代等功能
如果不进行使用的话,会出现如下情况:
在这里插入图片描述
Not Iterable 不可迭代
在这里插入图片描述
Not subscriptable

调用方法过后就可以正常运行了。

import collections
from random import choice

Card = collections.namedtuple('Card', ['rank', 'suit'])


class FrenchDeck:
    ranks = [str(n) for n in range(2, 11)] + list('J Q K A')
    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]


deck = FrenchDeck()
print(choice(deck))

抽取特定的纸牌 , 如第一张或者最后一张,deck[0]活deck[-1],这是由__getitem__提供的。

而且__getitem__方法把[]操作交给了self._cards列表,所以deck支持切片操作。

def spades_high(car_d):
    rank_value = deck.ranks.index(car_d.rank)
    return rank_value * len(suit_values) + suit_values[car_d.suit]


for card in sorted(deck, key=spades_high):
    print(card)

注意shadows name 的问题,
另外补充一个知识点,

sort(key=)

sort() 函数内含有 key 可以指定相关的函数来作为排序依据.

特殊方法只提一个,
能把对象用字符串的形式表达出来以便辨认__repr__这就是“字符串表示形式。
如果没有实现的话,打印向量实例得到的可能是

<Vector object at 0x10e100070>

在__repr__的实现中:

class Vector:
    
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def __repr__(self):
        return 'Vector(%r, %r)' % (self.x, self.y)


print(Vector(3, 5).__repr__())

注意这里用到了%r获取对象各个属性的标准字符串表示形式,暗示了一个关键:Vector(1,2)和Vector(‘1’, ‘2’)是不一样的。

总的来说,通过__repr__方便调试和记录日志,而__str__则对终端用户更友好,更为详细的回答Click

对于__bool__,如果一个向量的模是0,则返回False,其他情况返回True。
可尝试该方法判断是否为零向量:

def __bool__(self):
   return bool(self.x or self.y)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值