流畅的python-学习笔记_前言+第一部分

本文介绍了Python中特殊方法的应用,如`__len__`,`__getitem__`,`__str__`,和`__bool__`在数据模型和测试中的作用,以FrenchDeck类为例,讨论了如何实现可迭代和洗牌,以及可变性对设计的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

标准库doctest

测试驱动开发:先写测试,推动开发

obj[key]实际调用实例的__getitem__方法

python数据模型

特殊方法

特殊方法一般自己定义,供py解释器调用,不推荐自己手动调用。

对于py内置类型,调用特殊方法时,cython可能会直接从c结构获取字段值,免去了py特殊方法调用,加快方法耗时,比如求py内置类型列表或元组等len时,会调对象__len__方法,该方法会调PyVarObject的ob_size属性

特殊方法调用:大部分是隐式调用。len(obj)会调用 obj.__len__, for i in obj 会调用iter(obj),然后会调用obj.__iter__方法

__repr__和__str__

调用print(obj)或显示调用str(obj)时会调用__str__

直接obj时回显是__repr__的

__bool__

if obj时,会调用obj.__bool__,如果obj没有__bool__方法,则调用obj.__len__,如果返回0则False,返回非0则True

纸牌类

定义

__len__方法注意不要len(self),会形成无限循环

import collections
Card = 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]

随机抽牌

可用random.choice方法

可迭代

仅实现__getitem__方法后,实例就变成可迭代了

洗牌

对象不可变,如果添加__setitem__方法,则可洗牌,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值