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'"
python中一些特殊方法的作用相关推荐
- python中seed的用法什么作用_Python中的seed()方法怎么用
Python中的seed()方法怎么用?下面是seed()方法的相关介绍: 描述 seed() 方法改变随机数生成器的种子,可以在调用其他随机模块函数之前调用此函数. 语法 以下是 seed() 方法 ...
- python中函数和方法的区别
本篇内容主要介绍从几个维度来介绍下python中函数和方法的区别: 首先,从分类的角度来分析. (1)函数的分类: 内置函数:python内嵌的一些函数. 匿名函数:一行代码实现一个函数功能. 递归函 ...
- python深度讲解_《深度剖析CPython解释器》21. Python类机制的深度解析(第五部分): 全方位介绍Python中的魔法方法,一网打尽...
楔子 下面我们来看一下Python中的魔法方法,我们知道Python将操作符都抽象成了一个魔法方法(magic method),实例对象进行操作时,实际上会调用魔法方法.也正因为如此,numpy才得以 ...
- python中pylint使用方法(pylint代码检查)
一.Pylint 是什么 Pylint 是一个 Python 代码分析工具,它分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码. Pylint 是一个 Python 工具,除 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
- python 中if __name__ = '__main__' 的作用
python 中if __name__ = '__main__' 的作用 前言 首先我们要知道在python里面万物皆对象,模块也是对象,并且所有的模块都有一个内置属性 __name__. 一个模块的 ...
- python的用途实例-python中pass语句意义与作用(实例分析)
想必大家都是刚刚才开始接触python这门语言的,今天这篇文章就来带大家来了解一下python这门语言之中常常会用到的一个语句pass语句.想必大家都很好奇python中pass作用是什么,接下来我就 ...
- python使用方法-在Python中使用next()方法操作文件的教程
next()方法当一个文件被用作迭代器,典型例子是在一个循环中被使用,next()方法被反复调用.此方法返回下一个输入行,或引发StopIteration异常EOF时被命中. 与其它文件的方法,如Re ...
- python中range 10 0_如何在python中使用range方法
如何在python中使用range方法 发布时间:2021-01-05 16:55:23 来源:亿速云 阅读:94 作者:Leah 如何在python中使用range方法?很多新手对此不是很清楚,为了 ...
最新文章
- PHP数据库操作分页类
- 论面向组合子程序设计方法 之 燃烧的荆棘
- virtual server2005下创建citrix集群的一点记录
- DM 源码阅读系列文章(四)dump/load 全量同步的实现
- 【渝粤教育】国家开放大学2018年秋季 3722-22T燃气输配工程 参考试题
- 1 Vue的基础语法
- cs 5 下载地址 、视频教程、安装教程
- 如何将手机哔哩哔哩缓存的m4s格式的视频转换成mp4呢?
- 计算机进pe按键,台式机进入pe按什么键
- Tiny6410+K9GAG08U0E
- JavaScript验证身份证号码(15位/18位)
- 010Java知识点小结--抽象类、接口
- elk学习中遇到的一些问题
- 【HTML】Canvas(3)-绘制图片
- 关于更换固态硬盘的一些经历...
- 驱动辅助资料(工具,目录,指令,debug经验)
- Java培训机构出来好找工作吗?
- c/c++排坑(3) -- c/c++中的switch语句
- Greenplum学习实践-【安装部署】-2、 5.10集群部署
- 杰理之升级复位可以选择软复位跳转和绝对地址跳转【篇】
热门文章
- 开源视觉salm算法介绍
- python语言学习零基础教学视频_Python告白小白视频教程(零基础入门)
- oracle 导入excel时间格式,将.xls或者.excel格式的数据导入到Oracle中
- easy-ui的datagrid
- TOJ5398: 签到大富翁(简单模拟) and TOJ 5395: 大于中值的边界元素(数组的应用)...
- python 流程控制if判断
- Delphi面向对象学习随笔七:COM
- Install OpenStack Kilo Dashboard wiht Nginx + uWSGI On RHEL7.1
- VS 2008 生成操作中各个选项的差别
- WINDOWS下的squid