python中布尔类型是特殊的_Python中的特殊方法以及应用详解
前言
Python 中的特殊方法主要是为了被解释器调用的,因此应该尽量使用 len(my_object) 而不是 my_object.__len__() 这种写法。在执行 len(my_object) 时,Python 解释器会自行调用 my_object 中实现的 __len__ 方法。
除非有大量的元编程存在,直接调用特殊方法的频率应远小于实现它们的次数。
模拟数值类型
可以通过在自定义对象中实现 __add__ 和 __mul__ 等特殊方法 ,令其支持 +、* 等运算符。
如下面的模拟向量的 Vector 类:# vector.py
from math import hypot
class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
def __repr__(self):
return f'Vector({self.x}, {self.y})'
def __abs__(self):
return hypot(self.x, self.y)
def __bool__(self):
return bool(self.x or self.y)
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)
def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)
运行效果如下:>>> from vector import Vector
>>> v1 = Vector(2, 4)
>>> v2 = Vector(2, 1)
>>> v1 + v2
Vector(4, 5)
>>> v = Vector(3, 4)
>>> abs(v)
5.0
>>> v * 3
Vector(9, 12)
对象的字符串表示
Python 有一个 repr 内置函数,能把一个对象用字符串的形式表示出来。实际上这种字符串表达是通过对象内部的 __repr__ 特殊方法定义的。默认情况下,在控制台里查看某个对象时,输出的字符串一般是 这种形式。
__repr__ 返回的字符串应该准确、无歧义,并尽可能表示出该对象是如何创建的。比如前面的 Vector 对象,其 __repr__ 中定义的字符串形式类似于 Vector(3, 4),和对象初始化的语法非常近似。
__repr__ 和 __str__ 的区别在于,__str__ 是在向对象应用 str() 函数(或者用 print 函数打印某个对象)时被调用。其返回的字符串对终端用户更友好。
如果只想实现其中一个特殊方法,__repr__ 应该是更优的选择。在对象没有实现 __str__ 方法的情况下,Python 解释器会用 __repr__ 代替。# myclass.py
class MyClass:
def __repr__(self):
return 'MyClass'
def __str__(self):
return 'This is an instance of MyClass'>>> from myclass import MyClass
>>> my = MyClass()
>>> my
MyClass
>>> print(my)
This is an instance of MyClass
自定义布尔值
Python 里有 bool 类型,但实际上任何对象都可以用在需要 bool 类型的上下文(比如 if 或 while 语句)中。为了判断某个值 x 的真假,Python 会调用 bool(x) 返回 True 或 False。
默认情况下,自定义类的实例总是为真。除非这个类对于 __bool__ 或 __len__ 方法有自己的实现。
bool(x) 实际上调用了对象 x 中的 __bool__ 方法。如不存在 __bool__ 方法,则 bool(x) 会尝试调用 x.__len__(),返回 0 则为 False,否则为 True。# boolclass.py
class BoolClass:
def __init__(self):
self.list = []
def add(self, item):
self.list.append(item)
def __len__(self):
return len(self.list)>>> from boolclass import BoolClass
>>> b = BoolClass()
>>> len(b)
0
>>> bool(b)
False
>>> b.add(1)
>>> len(b)
1
>>> bool(b)
True# boolclass.py
class BoolClass:
def __init__(self):
self.list = []
def add(self, item):
self.list.append(item)
def __len__(self):
return len(self.list)
def __bool__(self):
return bool(sum(self.list))>>> from boolclass import BoolClass
>>> b = BoolClass()
>>> b.add(1)
>>> len(b)
1
>>> bool(b)
True
>>> b.add(-1)
>>> len(b)
2
>>> bool(b)
False
参考资料
Fluent Python
python中布尔类型是特殊的_Python中的特殊方法以及应用详解相关推荐
- 在python中布尔类型的值包括_Python中布尔类型
我们已经了解了Python支持布尔类型的数据,布尔类型只有True和False两种值,但是布尔类型有以下几种运算: 与运算:只有两个布尔值都为 True 时,计算结果才为 True. True and ...
- python类是实例的工厂_Python设计模式之工厂方法模式实例详解
本文实例讲述了Python设计模式之工厂方法模式.分享给大家供大家参考,具体如下: 工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类, ...
- python中布尔类型的值包括_Python 布尔值(Booleans)
1.布尔值(Booleans) 在编程中,您通常需要知道表达式是True还是False. 您可以评估Python中的任何表达式,并获得两个答案之一,True或False. 比较两个值时,将对表达式求值 ...
- python 获取值类型用于定义变量_Python中的变量和简单数据类型
变量: 变量是存储在内存中的值,在创建变量时会在内存中开辟一个空间. 变量可以指定不同的数据类型,这些变量可以存储整数,小数或字符串. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存 ...
- python中common在哪个模块导入_python的常用模块之collections模块详解
认识模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写的 ...
- python脚本语言采用声音作为手段_python 利用pyttsx3文字转语音过程详解
这篇文章主要介绍了python 利用pyttsx3文字转语音过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下# -*- coding: utf ...
- python列表是顺序表还是链表_Python数据结构与算法(链表使用详解)
链表 单向链表 p是头节点,指向第一个值,最后一个是伪节点,因为不指向地址. 表元素域elem用来存放具体的数据 链接域next用来存放下一个节点的位置(python中的标识) 变量p指向链表的头节点 ...
- python创建文件夹和文件夹_Python快捷创建文件夹和文件详解
Python快捷创建文件夹和文件详解 自己做文件时发现 简单的反复操作十分浪费时间,于是想到了 使用Python,这个分享给大家,快捷高效办公. 1.创建文件夹 # 批量 创建文件夹 import ...
- python中布尔值是什么意思_Python中的布尔值
表达式的真值存储为称为bool的python数据类型.此数据类型中只有两个这样的值.真假. 布尔数据类型 在下面的程序中,我们找到True和False布尔值的数据类型. 示例print(True) p ...
最新文章
- 账簿登记重要十条规则
- 5.8 正则化和数据标准化
- 【渝粤题库】陕西师范大学180208 产品管理 作业(专升本)
- oracle 最小权限,oracle低权限下获取shell
- 怎么分辨是不是外包工司_花2万做外装农村自建房秒变别墅,农村工头:这还让人怎么混?...
- 【python写一个无限弹窗】
- 三年级下册计算机知识点,【北师大】三年级下册语文各单元知识点归纳
- 「 iOS 知识小集 」2018 · 第 24 期
- 基于Java的网上手机销售系统的设计与实现(附:源码 论文 sql文件 部署视频)
- 虚函数,虚函数表,虚函数实现原理,虚函数实现机制,虚函数解决的问题
- 微软Windows 11正式发布!(文末送书)
- stc8实用外部晶振程序
- 愿世间美好与你环环相扣
- 2018 php 参考文献,现代简约设计参考文献2018
- 方舟生存进化是什么游戏?好不好玩
- unity 彩带粒子_Unity3D_(Shuriken粒子系统)制作简单的烟花爆炸效果
- 档案管理在计算机中的应用,计算机信息技术在档案管理中的应用论文原稿
- .NetCore——基于OpenCV人脸检测
- 智慧政务 | 云计算赋能传统政务升级
- 录屏工具哪个好?手机、电脑录屏都ok
热门文章
- 某人想在h小时内钓到_为某人命名以重新连接到您的服务器
- java ee7帮助文档_帮助推动Java EE向前发展
- javaone_JavaOne和OOW 2015总结
- 海盗云商插件_推销自己的海盗猫王运营商
- Java 14的新功能
- 您想了解的所有Throwable
- Spring Boot中的@SpringBootConfiguration注释
- 红帽 jboss_红帽正式宣布发布JBoss BPM Suite 6和JBoss BRMS 6
- mapreduce 算法_MapReduce算法–了解数据联接第二部分
- tomcat web应用_具有可执行Tomcat的独立Web应用程序