当前位置: 首页 > news >正文

法与家国建设征文网站提供佛山顺德网站设计

法与家国建设征文网站,提供佛山顺德网站设计,wordpress主题 500,wordpress 国人原创文章目录第一章 Python 数据模型1.1 python风格的纸牌1.2 如何使用特殊方法-通过创建一个向量类的例子1.3 特殊方法汇总第一章 Python 数据模型 python最好的品质是一致性 python解释器碰到特殊句法时,会使用特殊方法去激活一些基本的对象操作 这些特殊的方法以两个…

文章目录

  • 第一章 Python 数据模型
    • 1.1 python风格的纸牌
    • 1.2 如何使用特殊方法-通过创建一个向量类的例子
    • 1.3 特殊方法汇总

第一章 Python 数据模型

python最好的品质是一致性
python解释器碰到特殊句法时,会使用特殊方法去激活一些基本的对象操作
这些特殊的方法以两个下划线开头,以两个下划线结尾,如__getitem____len__
所谓的特殊句法,如通过下标访问列表,获取自定义类的元素的个数、重构操作符等等
__getitem__的读法: dunder getitem

随着学习的推进,对这一点的理解会逐渐加深......

我认为 ,特殊方法的实现,就是运算符的重构......

本章通过两个例子,来说明特殊用法

  1. 纸牌的例子
  2. 向量的例子

注:特殊方法是为了让编译器调用的,自己不需要调用。如没有obj.__len__()这种写法,应该使用len(obj)。此外, 不要自己想当然地随意添加特殊方法。

1.1 python风格的纸牌

创建一个纸牌类,实现__getitem____len__两个特殊方法
代码如下

import collections
Card = collections.namedtuple('Card', ['rank', 'suit'])  # 可以用来创建只有少数属性没有方法的类class FrenchDeck:ranks = [str(n) for n in range(2, 11)] + list('JQKA')  # 创建一个list 存放2-Asuits = 'spades diamonds clubs hearts'.split()  # 花色: 黑桃、红桃、方块、梅花# split默认为所有的空字符,包括空格、换行(\n)、制表符(\t)等。def __init__(self):self._cards = [Card(rank, suit)for suit in self.suitsfor rank in self.ranks]def __len__(self):return len(self._cards)def __getitem__(self, position):return self._cards[position]

创建一个纸牌类之后,对上述类可以进行操作,代码如下:

def run_card():# 打印输出通过collections.namedtuple创建的类、以及类型test_card = Card('7', 'diamonds') print(test_card)print(type(test_card))deck = FrenchDeck()print(deck.ranks)print(deck.suits)print(len(deck))  # 获取FrenchDeck类中元素的个数 调用__len__print(deck[8])  # 根据下标获取FrenchDeck类中的元素  调用__getitem__# 通过python 内置的方法进行随机选择,而不必重新写一个对象from random import choiceprint(choice(deck))   # 随机从类中选择一个元素print(choice(deck))# 可以使用自动切片,因为__getitem__方法把[]操作给了self._cards,所以可以使用切片print(deck[:3])  # 下标为0、1、2print(deck[12::13])  # 抽出索引是12的牌, 步长为13,一次取1个# 可迭代,因为有__getitem__,可以进行迭代、逆迭代for card in deck:print(card)# 反向迭代for card in reversed(deck):print(card)# 由于是可迭代的,因此可以使用 in, # 集合类型没有实现__contains__方法,那么in运算符就会按顺序进行一次迭代搜索。print(Card('Q', 'hearts') in deck)print(Card('r', 'hearts') in deck)# 排序  因为可以迭代,因此可以进行排序for card in sorted(deck, key=spades_high):  #  spades_high为排序策略的方法名print(card)suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)  # 花色的大小定义
def spades_high(card):rank_value = FrenchDeck.ranks.index(card.rank)  # 元素在类中的下标# print(card.rank +';'+ card.suit)# print('rank_value:'+str(rank_value))# print('len:'+ str(len(suit_values)))# print('*=' + str(rank_value * len(suit_values)))return rank_value * len(suit_values) + suit_values[card.suit]

FrenchDeck类隐式继承了Object类,但是功能却不是继承而来的
我们通过数据模型和一些合成来实现这些功能
通过实现__len____getitem__这两个特殊方法,FrenchDeck类就与python自有的序列数据类型一样,可以体现出python的核心语言特性
FrenchDeck类还可以用于标准库中random.choice、reversed、sorted这些函数
对合成的运用可以使得__len____getitem__的具体实现可以代理给self._cards这个列表

1.2 如何使用特殊方法-通过创建一个向量类的例子

实现一个二维向量类Vector
当然向量相关的运算在类中要进行实现,如输出(print)、加法(+)、取模(abs)、向量与数的乘法(*)、布尔判断(bool)

输出:通过内置函数repr,可以把一个对象用字符串形式表示出来以便辨认,这就是"字符串表示形式"
repr是通过特殊方法__repr__来实现的,
如果没有实现这个特殊方法,print这个对象的实例可能会得到<Vector object at 0x10e100070>
如果使用%来表示字符串,repr是通过%r来表示的
如果使用!来表示字符串,repr是通过!r来表示的
__repr__所返回的字符串应该准确、无歧义,并且尽可能表达出如何用代码创建出这个被打印的对象
__repr____str___的区别在于:后者是在str()被使用或者用print()打印一个对象时才被调用
由于python在调用str()时,如果没有发现__str__就会调用__repr__,因此优先创建__repr__

加法(+):Vector(2, 3) + Vectotr(3, 5) = Vector(5, 8)
采用特殊方法__add__:这个特殊方法返回的是一个新的对象,被操作的两个对象原封不动。

向量与数的相乘(*):Vector(2, 3) * 2 = Vector(4, 6)Vector(4, 6) * (-2) = Vector(-8, -12)
采用特殊方法__mul__:这个特殊方法同__add__一样,都是返回一个新的对象。

取模运算(abs):所谓的取模:就是元素的平方和再开方,即二范数 或 欧几里得范数
采用特殊方法__abs__
abs是一个内置函数,如果输入是整数或者浮点数,返回的是其绝对值;如果输入的是一个复数。返回的是复数的模
因此在Vector这个类中,通过调用abs,应当返回的是向量的模。

布尔运算(bool):这个函数只能返回TrueFalse
默认情况下,我们自己定义的类的实例总被认为是真的,除非这个类对__bool____len__有自己的实现,
bool(x)是调用x.__bool__()的结果,如果不存在__bool__,会调用__len__,如果返回0,bool就返回False,否则,返回True

Vector类的实现如下:

from math import hypot  # hypot 是用来求欧几里得范数的class Vector:def __init__(self, x=0, y=0):  # 定义了 x y 应该是整数类型self.x = xself.y = ydef __repr__(self):  # __repr__ 中要使用 %r 保存原格式  %r可以用来获取对象各个属性的标准字符串表示形式return 'Vector(%r, %r)' % (self.x, self.y)   # 此时输出的应该为 Vector(3, 4)def __abs__(self):return hypot(self.x, self.y)  # 返回欧几里得范数 就是向量的模# 如果模是0 返回False  否则返回True# 法1# def __bool__(self):#     return  bool(abs(self))# 法2 更高效,省掉了abs到__abs__到平方再到平方根这些过程def __bool__(self):return bool(self.x or self.y)  # or运算可能返回x或y本身的值,若x的值为真,则or返回x的值,否返回y的值def __add__(self, other):x = self.x + other.xy = self.y + other.yreturn Vector(x, y)def __mul__(self, scalar):return Vector(self.x * scalar, self.y * scalar)

Vector类的功能的调用,代码如下:

def run_vector():vector1 = Vector(3, 4)print('向量1=%r' % vector1)print('向量的模长= %f' % abs(vector1))vector2 = Vector(1, 2)print('向量2 = %r' % vector2)print('向量1 + 向量2 = %r' % (vector1 + vector2))# print('向量1 * 3 = %r' % (vector1 * 3))  # 数在后,向量在前,与__mul__一致print('向量1的bool = %r' % bool(vector1))

1.3 特殊方法汇总

python语法参考手册中的 Data Model列出了83个特殊方法的名字。下面列出概况。下表的分类方式与官方文档不同

与运算符无关的特殊方法:

类别方法名
字符串/字节序列表示形式__repr____str____format____bytes__
数值转换__abs____bool____complex____int____float____hash____index__
集合模拟__len____getitem___seitem____delitem____contains__
迭代枚举__iter____reversed____next__
可调用模拟__call__
上下文管理__repr____repr__
实例创建和销毁__new____init____del__
属性管理__getattr____getattribute____setattr____delattr____dir__
属性描述符__get____set____delete__
跟类相关的服务__prepare____instancecheck____subclasscheck__

跟运算法相关的特殊方法

类别方法名
一元运算符__neg__ -、 __pos__ +、 __abs__ abs()、
比较运算符__lt__ <、 __le__ <=、 __eq__ ==、 __ne__ !=、 __gt__ >、 __ge__ >=、
算术运算符__add__ +、__sub__ -、 __mul__ *、__truediv__ /、 __floordiv__ //、 __mod__ %、 __divmod__ divmod()、__pow__ ** 或pow()、 __round__ round()
反向算术运算符__radd____rsub____rmul____rtruediv__ __rfloordiv__ __rmod____rdivmod__
增量赋值算术运算符__iadd____isub____imul____itruediv____ifloordiv____imod____ipow__
位运算符__invert__ ~、 __lshift__ <<、 __rshift__>>、 __and__ &、 __or__
反向位运算符__rlshift____rrshift____rand__ __rxor____ror__
增量赋值位运算符__ilshift____irshift____iand____ixor____ior__

增量赋值运算符:a *= b
反向算术运算符,当两个操作数交换了前后位置,此时想要得到一致的结果,需要调用反向算术运算符

http://www.yayakq.cn/news/589135/

相关文章:

  • 专题网站搭建傻瓜式网站建设软件有哪些
  • 重庆建站公司官网江门市住房城乡建设局网站
  • 中国设计师个人网站wordpress菜单如何做
  • 泉州建站服务爱趣网
  • 深圳网站建设的公司网页设计入门教材pdf
  • 福田网站建设龙岗网站建设罗湖网站建设罗湖网站建设品牌设计案例网站
  • 小企业网站建设厂家有哪些电商网站怎么做支付
  • 企业门户网站属于什么层企业网站开发哪家专业
  • 漳州住房和城乡建设部网站WordPress博客整站带数据
  • .net做的大型网站吗河南建设信息港网站查询
  • 网站备案一天通过网站加密
  • 南宁网站seo优化公司美丽阿坝网站怎么做
  • 北京做家教的的网站做最好的网站新新
  • 北京商城网站建设报价单django可以做多大的网站
  • 大型网站的技术架构问题免费网站制作申请
  • 旅行网站开发需求说明书wordpress模版使用
  • 苏州网站建设优化过哦中建八局招聘出国劳务
  • 福州云建站模版做网站的专业词汇
  • 做机电预算的网站国内顶尖工业设计公司
  • 中国建设银行个人网站银行汽车网站推广策划方案
  • 个人网站备案拍照网站 关键词库
  • 美术馆网站网页设计方案广州网站推广多少钱
  • 网站系统维护一般多久东营人力资源考试信息网官网
  • 网站建设讲师招聘wordpress 箭头翻页
  • 小型网站维护东莞网站制作公司怎么选择
  • 深圳网站建设 设计卓越给国外做网站
  • 快速网站轻松排名哪家好dedecms导航网站
  • 凡客建站手机版下载织梦网站图片代码
  • 门户站点是什么做网站的准备什么软件
  • 建设政协网站的意义如何做网页游戏网站