专栏首页BrianPython Data Model

Python Data Model

概述

最近在看《Fluent Python》一书,书中解释了Python很多重要的设计理念和实践,下面是我在看此书的读书笔记。Python的设计思想主要体现在它的数据模型上,而数据模型所描述和传递的API更能让你创造出和抽象出自己对象世界。数据模型是对Python框架的描述。 magic and dunder:magic是特殊方法的昵称,dunder是双下划线.

Data Model 深入

为了深入了解Python Data Model的内部实现,我们先看一下代码示例:

# -*- coding:utf-8 -*-

# -*- coding:utf-8 -*-

from collections import namedtuple
from random import choice
#namedtuple用于构建没有方法且少量属性的对象,比较方便的适用于数据库存储的实体对象。
Card = namedtuple('Card', 'rank suit')

class Deck(object):
	'''自定义的对象,自己重写了__len__和__getitem__方法。'''
	ranks = [str(n) for n in range(2, 11)] + list('JQKA')
	suits = 'S D C H'.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, pos):
		'''为了实现deck[0],deck[2]模型,自动支持切片和可迭代对象'''
		return self._cards[pos]
	
# 为了排序用的
suit_values = dict(S = 3, D = 1, C = 0, H = 2)
def sorted_high(card):
	rank_value = Deck.ranks.index(card.rank)
	return rank_value + len(suit_values) + suit_values[card.suit]
	

if __name__ == "__main__":
	deck = Deck()
	print(len(deck), deck[0])
	a = choice(deck)
	print(a)
	#对于in操作,如果没有实现__contains__方法,in云算法会进行一次迭代搜索。
	print(Card('A', 'H') in deck)
	for i in sorted(deck, key= sorted_high):
		print(i)
#输出为
52 Card(rank='2', suit='S')
Card(rank='4', suit='C')
True
Card(rank='2', suit='C')
.
.
.
Card(rank='A', suit='S')

Python的特殊方法主要为了供编译器使用和优化的,我们并不需要调用它,比如:我们调用len(deck),Python会自动调用object len()方法。如果我们所操作的对象是Python内置类型(List,str,bytearray等),len直接返回PyVarObject(表示内存长度可变的内置对象的结构体)里的db_size属性,不是方法,所以速度较快。通过内置的函数来使用特殊方法是最好的选择。 下面我们来看来实现一个向量运算的例子,比如:提供加减乘操作。

# -*- coding:utf-8 -*-

from math import hypot

class Vector(object):
	def __init__(self, x = 0, y = 0):
		self.x = x
		self.y = y
		
	def __repr__(self):
		return 'Vector(%r,%r)' % (self.x, self.y)
	
	def __abs__(self):
		'''实现vector的长度计算'''
		return hypot(self.x, self.y)
	
	def __bool__(self):
		'''默认情况下,自定义的类实例都是True,除非自己实现该函数。调用bool(x),x首先调用__bool__方法,如果不存在则去调用__len__方法。'''
		return bool(abs(self))
	
	def __add__(self, other):
		'''实现vector1+vector2的加法操作'''
		x = self.x + other.x
		y = self.y + other.y
		return Vector(x, y)
	
	def __mul__(self, scalar):
		'''实现vector1x10的加法操作'''
		return Vector(self.x * scalar, self.y * scalar)
		
if __name__ == "__main__":
	v1 = Vector(1, 2)
	v2 = Vector(1, 2)
	print(abs(v1))
	print(v1 + v2)
	print(v1 * 10)
#输出为
2.23606797749979
Vector(2,4)
Vector(10,20)

Python对象模型又称为Python数据模型

参考书籍 《Fluent Python》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python 多线程的同步方法

    ---- 概述 这篇博客是我翻译Python threads synchronization: Locks, RLocks, Semaphores, Condi...

    BrianLv
  • Python With-As

    深入理解Python的With-as语句 ---- 学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,...

    BrianLv
  • Python 性能分析

    Python性能分析与优化 一个优秀的程序员,在保证业务正常的条件下都会追求自己的程序更快、更省。更快:运行时间短;更省:相对节省计算机资源(比如:CPU、M...

    BrianLv
  • 数据结构(三):队列

      队列通常用来实现消息(任务)的快速读写,即消息队列。消息队列的常用来解决如下问题:

    py3study
  • 数据结构之——Python实现循环队列

    栈是先入后出,与之相反的是队列,队列是先进先出的线性结构。队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端...

    py3study
  • Python 3 之 运算符重载详解

    实际上,“运算符重载”只是意味着在类方法中拦截内置的操作……当类的实例出现在内置操作中,Python自动调用你的方法,并且你的方法的返回值变成了相应操作的结果。...

    py3study
  • python高级编程第二讲:类与对象深度问题与解决技巧

    将上面的代码我们进行改造,引入内存跟踪的类,并且将2个类分别实例化100000次,并打印相应的内存大小

    小海怪的互联网
  • python模块:win32com用法详解

    import win32com from win32com.client import Dispatch, constants

    菲宇
  • Python开发植物大战僵尸游戏,详细教程

    一墨编程学习
  • 基于Django的电子商务网站开发(连载33)

    顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscr...

    小老鼠

扫码关注云+社区

领取腾讯云代金券