python中一些特殊方法的作用

我们先暂且称呼为特殊方法。

单下划线开头(_foo)双下划线开头的(__foo)双下划线开头和结尾的( __foo__)
代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用“from xxx import *”而导入;代表类的私有成员代表python里特殊方法专用的标识,如 _init_()代表类的构造函数

文章目录

    • 1 __repr__方法
    • 2 __str__ 方法
    • 3 __str__ and __repr__ example
    • 4 python 类中的self是是什么
    • 5 python3中的__slots__
    • 6. __call__方法
    • 7. 对象表现形式(__bytes__)
    • 8.str.format()的简单用法
      • 字段名:省略;数字;变量名
      • 转换字段: !s !r !a

1 __repr__方法

_repr__是类的内建方法,所有的类都是继承自Object类,因此在外部调用时,需要使用repr函数,好比Node类通过重写__repr_,从而重写了repr。
这是文档上标注的,因为理解不太贴切,所以还是放上官方介绍吧。

Return a string containing a printable representation of an object.
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object.
A class can control what this function returns for its instances by defining a repr() method.

class Node(object):def __init__(self, value, flag = 1):self._value = valueself._children = []self._flag = flagdef add_child(self, node):self._children.append(node)def __repr__(self):return 'Node({!r})'.format(self._value)if __name__ == '__main__':n1 = Node(0)print(n1)#Node(0)

2 str 方法

此方法返回对象的字符串表示形式。在对象上调用print()或str()函数时调用此方法。
这个方法必须返回String对象。如果我们没有为类实现_str__()函数,那么使用内置的对象实现来实际调用_repr__()函数。

3 str and repr example

我们注意到无论是__str__还是__repr__方法,返回的都要求是str类型

class Person(object):name = ""age = 0def __init__(self, personName, personAge):self.name = personNameself.age = personAgedef __repr__(self):return '{name'+self.name + ',' + 'age:' + str(self.age) + '}'def __str__(self):return 'Person(name=' + self.name + ', age=' + str(self.age) + ')'p = Person('Pankaj', 34)
# __str__() example
print(p) #Person(name=Pankaj, age=34)
# print(p.__str__())#Person(name=Pankaj, age=34)
# s = str(p)
# print(s)#Person(name=Pankaj, age=34)
#
# # __repr__() example
# print(p.__repr__())
# print(type(p.__repr__()))
# print(repr(p))

we mentioned that if we don’t implement str function then the repr function is called. Just comment the str function implementation from Person class and print§ will print {name:Pankaj, age:34}.我们发现,__str__的优先级是大于__repr__的。

4 python 类中的self是是什么

self指的是类实例对象本身(注意:不是类本身)。

5 python3中的__slots__

当一个类需要创建大量实例时,可以通过__slots__声明实例所需要的属性,

例如,class Foo(object): slots = [‘foo’]。这样做带来以下优点:

  • 更快的属性访问速度
  • 减少内存消耗

使用__slots__也是有副作用的:

1. 每个继承的子类都要重新定义一遍__slots__
2. 实例只能包含哪些在__slots__定义的属性,这对写程序的灵活性有影响,比如你由于某个原因新网给instance设置一个新的属性,比如instance.a = 1, 但是由于a不在__slots__里面就直接报错了,你得不断地去修改__slots__或者用其他方法迂回的解决
3. 实例不能有弱引用(weakref)目标,否则要记得把__weakref__放进__slots__

另外参考:https://zhuanlan.zhihu.com/p/25930288

6. __call__方法

一个函数(甚至对象)之所以能执行,关键就在于 call() 方法。实际上 x(arg1, arg2,…) 只是 x.call(arg1, arg2, …) 的快捷写法,因此我们甚至可以为自定义类添加 _call_ 方法,从而使得该类的实例也变成可调用的。例如如下代码:

# 定义Role类
class Role:def __init__ (self, name):self.name = name# 定义__call__方法def __call__(self):print('执行Role对象')
r = Role('管理员')
# 直接调用Role对象,就是调用该对象的__call__方法
r()# 执行Role对象

上面程序中最后一行代码使用调用函数的语法来调用对象,这看上去似乎是错误的,但由于该 Role 类提供了\ call 方法,因此调用对象的本质就是执行该对象的 _call_ 方法。运行上面代码,将看到如下输出结果:

对于程序中的函数,同样既可使用函数的语法来调用它,也可把函数当成对象,调用它的 call 方法。例如如下示例代码:

def foo ():print('--foo函数--')
# 下面示范了2种方式调用foo()函数
foo()
foo.__call__()
运行上面代码,可以看到 foo() 和 foo.__call__() 的效果完全相同。

7. 对象表现形式(bytes)

在 Python 3 中,

  • _repr_、_str_ 和 _format_ 都必须返回 Unicode 字符串(str 类型)。
  • 只有_bytes_ 方法应该返回字节序列(bytes 类型)。

8.str.format()的简单用法

字段名:省略;数字;变量名

‘name is {}, age is {}’.format(‘peter’,25)
‘name is {1}, age is {0}’.format(25, ‘peter’)
‘name is {name}, age is {age}’.format(name=‘peter’,age=‘25’)

转换字段: !s !r !a

  • s:传递参数之前先对参数调用 str()
  • r:传递参数之前先对参数调用 repr()
  • a:传递参数之前先对参数调用 ascii()

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return 'Person({0.name!r}, {0.age!r})'.format(self)def __str__(self):return '({0.name!s}, {0.age!s})'.format(self)person = Person('peter', 25)
'this person is {!r}'.format(person)
'this person is {!s}'.format(person)
'this person is {!a}'.format('皮特')# result
"this person is Person('peter', 25)"
'this person is (peter, 25)'
"this person is '\\u76ae\\u7279'"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring的IOC原理[通俗解释一下]

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖&am…

python爬虫面试遇到的问题

文章目录1python基础1.1 列表生成式和生成器的区别 ?1.2 如何不用任何循环快速筛掉列表中的奇数元素 ?1.3 map和reduce的用法1.4 装饰器的作用1.5 Python中__new__与__init方法的区别1.6 python中的设计模式1.7 lambda函数,以及它…

ubuntu18 常用命令

文章目录卸载和安装卸载和安装 1.打开一个终端,输入dpkg --list ,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。 2.安装 dpkg –i name.deb 安装一个 deb 包;在终端上输入命令sudo apt-get --purge remove 包…

以嵌入式系统设计师考试成绩,开始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 转载于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介绍 1.2. SSH框架配置 所需资源下载: l jdk; 从Oracle官方网站:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下载jdk,win7是默认安装在C:\Program Files (x86)\Java\jdk1.6.0_25路径下…

cookie,session的区别和联系(补充token)

文章目录1 http为什么是无状态的2 cookie 和session 的区别详解3 token参考:备注: 博客文章仅限于学习,禁止商用1 http为什么是无状态的 2 cookie 和session 的区别详解 这些都是基础知识,不过有必要做深入了解。先简单介绍一下。 二者的定…

库函数和系统调用的区别

前言 这是一对非常容易混淆的概念。对于用户( 应用程序开发者 )来说,并不一定要严格区分其意义。因为在用户看来,它们都是以C函数的形式出现的。但了解二者的区别对我们掌握整个计算机系统有很大帮助。 区别 1. 一部分库函数实现需要使用系统调用( 如 pr…

Flask 从入门到熟悉(不敢称为精通)

文章目录2.1 Flask介绍及其安装2.2 Virtualenv3.1 一个最小的应用3.2 外部课件服务器3.3 调试模式4.1 路由介绍4.2 变量规则4.3 构建URL4.4 HTTP 方法4 总结5.1 静态文件5.2 渲染模板5.3 练习66.1 接收请求数据6.2 请求对象6.3 文件上传6.4 Cookies6 总结77.1 重定向和错误7.2 …

Ext JS 5 beta版发布

原文:Announcing Public Beta of Ext JS 5我们非常高兴的宣布,Sencha Ext JS 5 beta版本开始进行公测了。这个beta版本可以让你、我们Sencha社区来对我们的Ext JS 5的工作进度进行评测。对于所以Ext JS开发人员,这事一个很好的机会来协助完成…

算法【二分查找】(数组)

1 .山脉数组的巅峰索引 信息 我们把符合下列属性的数组 A 称作山脉&#xff1a; A.length > 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i1] > … > A[A.length - 1] 给定一个确定为山脉的数组&#xff0c;返回任何满…

关于癌症的十大谣言

最近&#xff0c;国外网站总结了西方社会中流行的十个关于癌症的谣言&#xff0c;其中很多谣言在我们周围也有广泛的传播。 谣言1&#xff1a;癌症是人为导致的现代疾病 或许在公众的认知里&#xff0c;癌症在今天要比历史上任何时期都重要。不过实际上&#xff0c;癌症可不是一…

[python 进阶] 第7章 函数装饰器和闭包

文章目录7.1 装饰器基础知识7.2 Python何时执行装饰器7.3 使用装饰器改进“策略”7.4 变量作用域(global)备注 -比较字节码&#xff08;暂略&#xff09;7.5 闭包7.6 nonlocal声明global和nonlocal的区别7.7 实现一个简单的装饰器7.8 标准库中的装饰器7.8.1 使用functools.lru_…

自制“低奢内”CSS3登入表单,包含JS验证,请别嫌弃哦。

要求 必备知识 基本了解CSS语法,初步了解CSS3语法知识。和JS/JQuery基本语法。 开发环境 Adobe Dreamweaver CS6 演示地址 演示地址 预览截图(抬抬你的鼠标就可以看到演示地址哦): 制作步骤: 一, html结构 <div id"home"><form id"login" class…

class里面只能写以下5种

转载于:https://www.cnblogs.com/phplearnings/p/3650849.html

【排序】算法(python实现)

文章目录python 排序算法1 插入排序1.1 直接插入排序算法思想1.2 希尔排序算法思想2. 选择排序2.1 简单选择排序2.2 堆排序参考python 排序算法 1 插入排序 1.1 直接插入排序 算法思想 直接插入排序的核心思想就是&#xff1a;将数组中的所有元素依次跟前面已经排好的元素相…

OpenSSL漏洞补救办法详解(转)

CVE-2014-0160漏洞背景 2014年4月7日OpenSSL发布了安全公告&#xff0c;在OpenSSL1.0.1版本中存在严重漏洞(CVE-2014-0160)。OpenSSL Heartbleed模块存在一个BUG&#xff0c;问题存在于ssl/dl_both.c文件中的心跳部分&#xff0c;当攻击者构造一个特殊的数据包&#xff0c;满足…

SharePoint 自定义WebPart之间的连接

1、创建SharePoint解决方案&#xff0c;添加两个WebPart分别用来发送和接收&#xff1b; 2、发送值的WebPart需要继承自IWebPartField(当然&#xff0c;根据需要还可以选择IWebPartField,IWebPartParameters,IWebPartRow,IWebPartTable&#xff0c;具体参见msdn)&#xff0c;原…

[python 进阶] 9. 符合Python风格的对象

文章目录9.1 对象表示形式9.2 再谈向量类9.3 备选构造方法9.4 classmethod与staticmethod9.5 格式化显示9.6 可散列的Vector2d什么是可散列的数据类型9.6 可散列的Vector9.7 Python的私有属性和“受保护的”属性9.8 使用 __slots__ 类属性节省空间本章包含以下话题&#xff1a;…

android软件获取系统签名

有时候有的功能必须要有系统签名才能使用&#xff0c;例如调用系统自带的Surface.screenShot方法时&#xff0c;就必须在androidManifest.xml里声明android:sharedUserId"android.uid.system" 但是这个时候在编译生成的apk很有可能无法安装的情况 并且报这个错误&…