4-19 面向对象 的内置方法
1,__str__ 和 __repr__
__str__就是改变对象的字符串显示。
Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,这就是“字符串表示形式”。repr就是通过__repr__这个特殊方法来得到一个对象的字符串表示形式。如果没有实现__repr__,当我们再控制台里打印一个变量的实例时,得到的字符串可能会是<__main__.Object at 0x14af07dbe80>,这个表示的是打印的对象,以及对象的内存地址。
str()的结果是依赖obj.__str__()
print(obj)的结果是依赖obj.__str__()
%s的结果是依赖obj.__str__()
repr的结果是依赖obj.__repr__()
%r的结果是依赖obj.__repr__()
所以说repr是str得到备胎。
在类中,当把对象作为参数传入print()时,会自动调用对象的__str__方法,但是当__str__方法不存在时,则会调用__repr__方法。
所以,如果你只想实现这两个特殊方法中的一个,建议还是选择__repr__方法。
class List:def __init__(self,*args):self.l = list(args)def __str__(self):return '[%s]'%(','.join([str(i) for i in self.l])) l = List(1,2,3,4,5) print(l) #--> l.__str__() # object类中的__str__就是返回一个数据的内存地址 print(l) print(str(l)) print('%s'%l) print(obj) 的结果 是 obj.__str__()的结果 str(obj)
因为class int 和class str 的__repr__的方法不同。
class int:def __repr__(self):return str(1) class str2:def __repr__(self):return "%s"%str(1) a = int() b = str2() print(repr(a)) print(repr(b))
2,__format__
在类中自定义字符串的格式化输出。
format_dict={'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名 } class School:def __init__(self,name,addr,type):self.name = nameself.addr = addrself.type = typedef __format__(self, format_spec):if not format_spec or format_spec not in format_dict:format_spec = 'nat'fmt = format_dict[format_spec]return fmt.format(obj=self) s1 = School('oldboy1','北京','私立') print(format(s1,'nat')) print(format(s1,'tna')) print(format(s1,'tan')) print(format(s1,'asadafsfsf'))
View Code
3,__del__
析构方法,在删除一个对象的时候,做了一些收尾工作。
class A: def __init__(self): self.f = open('文件','w') def __del__(self): self.f.close() print('执行我啦')a = A()del aprint(a)print('aaa')
4,__new__构造方法
创建对象的过程就是__new__: 对象的创建,是一个静态方法,第一个参数是cls。(想想也是,不可能是self,对象还没创建,哪来的self)
利用这个方法和类属性的特性可以实现设计模式中的单例模式.单例模式是指创建唯一对象吗,单例模式设计的类只能实例化一个对象。
class B:__instance = Nonedef __new__(cls, *args, **kwargs):if cls.__instance is None:obj = object.__new__(cls)cls.__instance = objreturn cls.__instancedef __init__(self,name,age):self.name = nameself.age = agedef func(self):print(self.name) a = B('alex',80) b = B('egon',20) print(a) print(b) print(a.name) print(b.name)
5,__call__ (callable就是判断一个对象可否被调用)
在类内一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__内置方法。
class Teacher:def __call__(self):print(123)def call(self):print(123) t = Teacher() #t.call() t() print(callable(Teacher)) print(callable(t))
6,__eq__ == 判断self对象是否等于other对象
class A:def __eq__(self, other):# if self.__dict__ == other.__dict__:return True # __eq__() a = A() a.name = 'alex' b = A() b.name = 'egon' print(a) print(b) print(a == b)
7,__items__系列
__getitem__(self,key):返回键对应的值。
__setitem__(self,key,value):设置给定键的值。
__delitem__(self,key):删除给定键对应的元素。
当我们对类的属性item进行下标的操作时,首先会被__getitem__()、__setitem__()、__delitem__()拦截,从而进行我们在方法中设定的操作,如赋值,修改内容,删除内容等等。
class Foo:def __init__(self,name):self.name=namedef __getitem__(self,item):return self.__dict__[item]def __setitem__(self, key, value):self.__dict__[key]=valuedef __delitem__(self, key):print('del obj[key]时,我执行')self.__dict__.pop(key)f = Foo('alex') # f.name = ... print(f['name']) # f.__getitem__('name') f['age'] = 18 # 赋值 print(f.age) # 自带的语法 print(f['age']) # 修改 f['age'] = 80 print(f['age']) print(f.__dict__)# 通过实现__getitem__得到的 del f['age'] print(f.age) # 删除
View Code
转载于:https://www.cnblogs.com/yzxing/p/8884535.html
4-19 面向对象 的内置方法相关推荐
- python_day21面向对象的进阶(反射,内置方法,)
# 两个内置函数 *# 反射 *****# 内置方法 *** # 类(定义) # 静态属性 类属性(变量) 直接写在类中,全大写 # 动态属性 方法(函数) self # 类方法 @classmeth ...
- 面向对象之反射和其他内置方法
一.反射 1.概念:主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.简而言之,就是自身调用自身即可实现已定义的某一功能,以达到简化程序的作用. 2.python面向对象中的反射是指通过字符 ...
- python如何设计工具类_Python面向对象 --- 类的设计和常见的内置方法
面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...
- Python 入门 —— Python 面向对象:类的创建及其基本内置方法的使用
Python 面向对象:类的创建及其基本内置方法的使用 首先了解一下什么是面向对象 面向过程: 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ...
- python类的内置方法_python面向对象之类中的内置方法
__setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...
- 面向对象-1-类和对象、基础语法、初始化、内置方法和属性
1. 基本概念 2. 类和对象 例如: 3. 面向对象基础语法 class Cat:def eat(self):print('小猫爱吃鱼')def drink(self):print ('小猫爱喝水' ...
- python全栈开发基础【第十七篇】面向对象反射和内置方法
一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...
- 面向对象进阶------内置函数 str repr new call 方法
__new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始 是先继承父类中的new方法再执行init的 就好比你生孩子 先要把孩子生出来才能对孩子 ...
- 面向对象--内置方法
__名字__ 类中的特殊方法\内置方法 双下方法 魔术方法 magic_method 类中的每一个双下方法都有它自己的特殊意义 1.__call__ 相当于 对象() class A:def __ca ...
- python 面向对象_多态、内置方法、反射
内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...
最新文章
- Nginx配置文件nginx.conf中文详解(转)
- spring WebServiceTemplate 调用 axis1.4 发布的webservice
- asp.net学习资源汇总
- boost::hana::test::TestSearchable用法的测试程序
- uCOS-II核心算法分析(μCOS-Ⅱ)
- 求1-100的所有数的和
- spark 获取广播变量_spark使用广播变量
- WebStorm 9“神器”变“霸器”
- 重庆自考学历计算机应用基础考试,2017年自考计算机应用基础模拟试题1
- 详解如何基于Arduino兼容板Digispark实现虚拟键盘与鼠标
- mybatis 查询
- 运筹学_单纯形法_week3
- Java Duration格式
- 双非普通一本大一学生学期末课设——运动会比赛计分系统
- python傅里叶逆变换_C# 傅里叶变换 逆变换 调用MathNet包|简明python教程|python入门|python教程...
- pb导入excel文件
- 没有申报就对房屋进行装修可以吗?
- word锁定:解决Word文档由于文档保护而无法修改、查找、编辑的方法
- Android蓝牙开发系列文章-蓝牙mesh(一)
- BAT前端老鸟总结:未来几年web前端发展四大趋势前瞻