python模型的属性是什么_Python数据模型
Python解释器在遇到特殊的句法(通常以双下划线开头)时,会使用特殊的方法去处理它。
比如我们在使用列表或者字典时经常会用到obj[key],而解释器遇到obj[key]时会调用obj.getitem(key)来获取值。
一摞有风格的纸牌(python2.7)
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]
if __name__ == '__main__':
deck = FrenchDeck()
print len(deck)
for card in deck:
print card
上面的代码中几点需要注意的:
1.namedtuple:用以构建只有少数属性但是没有方法的对象
2.可以使用len(FrenchDeck())来获取这一叠牌的数量
3.可以使用FrenchDeck()[0]来获取第一张牌,这是因为定义了__getitem__()方法
4.可以使用for来迭代这一叠牌,也是因为__getitem__()方法
在Python中,很多时候特殊方法的调用是隐式的,比如for i in x:这个语句,背后调用的是iter(x),而这个函数的背后则是x.iter()方法。
repr()和str()的区别:
__str__()是在使用str()函数时或者在用print打印一个对象的时候被调用,并且它返回的字符串对终端用户更加友好。
__repr__()是在使用repr()函数被调用,交互式的控制台和调试程序用repr()函数来获取字符串表示形式
常用的特殊方法:
字符串表示形式:__repr__ __str__
集合模拟:__len__ __getitem__ __setitem__ __contains__
迭代枚举:__iter__ __next__
可调用模拟:__call__
上下文管理:__enter__ __exit__
实例的创建和销毁:__new__ __init__ __del__
属性管理:__getattr__ __getattribute__ __setattr__ __delattr__ __dir__
属性描述符:__get__ __set__ __delete__