betway必威-betway必威官方网站
做最好的网站

流畅的python之数据模型,关于python的特殊方法

最近在阅读《流畅的python》这本书,在第一章中作者就提到了几个python中的特殊方法,代码入下:

 1 class FrenchDuck:
 2     ranks = [str(n) for n in range(2, 11)]   list('JQKA')
 3     suits = 'spades diamonds clubs hearts'.split()
 4 
 5     def __init__(self):
 6         self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]
 7 
 8     def __len__(self):
 9         return len(self._cards)
10 
11     def __getitem__(self, position):
12         return self._cards[position]

__init__(self)方法大家都很熟悉,可以把它理解为类的构造函数。

__len__(self)方法是用来返回对象长度的特殊方法,实际上是调用len()方法获取对象长度,由于在这个例子中,对象是一个集合所以返回的是集合的长度。

__getitem__(self,posititon)方法倒是第一次见,作者的解释是这样的:

 比如obj[key]的背后就是__getitem__方法,为了能求得my_collection[key]的值,解释器实际上会调用my_collection.__getitem__(key).

可变集合需要实现: __len__ __getitem__ __setitem__ __delitem__
不可变集合需要实现: __len__ __getitem__

《流畅的python》一书是python入门之后进阶的一本好书。它不是一本完备的python手册,而是强调python作为编程语言独有的特性。这些特性或者是python独有的,或者是其它编程语言里很少见的。在接下来的一段时间,我会整理这本书的笔记,大家相互学习,共同进步。

__len__:返回集合长度

一、pythonic风格的代码是什么样的?

__getitem__(self, item) 使用索引访问元素

最简单的两个变量a,b交换value:

__setitem__(self, key, value) 对索引赋值,使用 self[key] = value 。

其它语言大部分需要用到临时变量,例如:

__delitem__(self, key) 删除索引值 del self[key]

$a = 100;

__contains__ 实现in运算符,如果没有实现这个方法python也会调用__getitem__来使in运算符可用

$b = 200;

一个简单的例子:

$c = $a;

class TemTest:
    def __init__:        self.x=[i for i in range(10)]
    def __len__:        return len
    def __getitem__(self, item):        return self.x[item]
    def __setitem__(self, key, value):        self.x[key]=value
    def __delitem__(self, key):        del self.x[key]
    def __contains__(self, item):        return item in self.x
    def __repr__:        return '{}'.format

test=TemTest() #实例化print) #返回长度print   #打印下标0的值print  #切片test[3]=10       #将下标3的值替换为10printdel test[3]      #删除下标3的值printprint(1 in test)  #测试in运算符print(3 in test)  

100[0, 1, 2][0, 1, 2, 10, 4, 5, 6, 7, 8, 9][0, 1, 2, 4, 5, 6, 7, 8, 9]TrueFalse

$b = $a;

$a = $c;

echo $a,$b;#200100

$a 与$b交换值,需要借助临时$c来实现。如果是python呢?

a,b = 100,200

a,b = b,a

print(a,b)#200 100

对,这就是pythonic的代码,是不是很简单易读?来个更直观的栗子:

定义一副扑克牌

import collections

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

class FrenchDeck:

rank = [str(i) for i in range(2,11)] 'JQKA'

suit = 'spades diamonds clubs hearts'.split()

def __init__(self):

self._cards = [Card(rank,suit) for suit in self.suit for card in self.rank]

本文由betway必威发布于编程开发,转载请注明出处:流畅的python之数据模型,关于python的特殊方法

TAG标签: betway必威
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。