前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python的特殊方法

python的特殊方法

作者头像
哒呵呵
发布2018-08-06 15:29:48
5710
发布2018-08-06 15:29:48
举报
文章被收录于专栏:鸿的学习笔记鸿的学习笔记

如书中所言,python拥有一致性。

整个的框架:

迭代

集合类

属性访问

运算符重载

函数和方法的调用

对象的创建和销毁

字符串表示形式和格式化

管理上下文(with语句)

开篇提到了__getitem__和__len__方法,看下面的示例代码

代码语言:javascript
复制
import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])
class FrenDeck:
    ranks = [str(n) for n in range(2,11)] + list('JQKA')
    suits = 'a b c d'.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]
beer_card = Card('7', 'da')
beer_card
Out[3]: Card(rank='7', suit='da')

namedtuple主要是用来构建只有少数属性但没有方法的类

代码语言:javascript
复制
card = FrenDeck()

对上面这个类实例化

代码语言:javascript
复制
len(card)
Out[6]: 52

也就是说有了__len__这个方法,重载了len方法,在这上面做一下修改:

代码语言:javascript
复制
    def __len__(self):
        return 10

这个时候

代码语言:javascript
复制
len(card)
Out[12]: 10

由此可见一般python和其他语言的方法的不同,比如java是通过a.length()来判断长度这个体现了python的语言特性

和这个相似的方法有

__getitem__:这样就可以迭代了以及切片了

__contains__:in运算符就有意义了

这些特殊方法的使用

1.这是为了给python解释器调用,而不是自己的类调用,而这个是你自定义的类,会如上所示,会使用你的__len__方法

2.如果len这个是python内置类型,会直接调用PyVarObject里的ob_size

3.不要随意调用这些特殊方法

通过实现特殊方法,可以使得你的类和python的内置类型一样

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 鸿的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档