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 面向对象 的内置方法相关推荐

  1. python_day21面向对象的进阶(反射,内置方法,)

    # 两个内置函数 *# 反射 *****# 内置方法 *** # 类(定义) # 静态属性 类属性(变量) 直接写在类中,全大写 # 动态属性 方法(函数) self # 类方法 @classmeth ...

  2. 面向对象之反射和其他内置方法

    一.反射 1.概念:主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.简而言之,就是自身调用自身即可实现已定义的某一功能,以达到简化程序的作用. 2.python面向对象中的反射是指通过字符 ...

  3. python如何设计工具类_Python面向对象 --- 类的设计和常见的内置方法

    面向对象:一种基于面向过程的新的编程思想.也就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位,而方法或者说是算法作为其次,这是对数据一种 ...

  4. Python 入门 —— Python 面向对象:类的创建及其基本内置方法的使用

    Python 面向对象:类的创建及其基本内置方法的使用 首先了解一下什么是面向对象 面向过程: 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了. ...

  5. python类的内置方法_python面向对象之类中的内置方法

    __setattr__,__delattr__,__getattr__,__getattribute__以及标准类型的二次加工 __setattr__,__delattr__,__getattr__的 ...

  6. 面向对象-1-类和对象、基础语法、初始化、内置方法和属性

    1. 基本概念 2. 类和对象 例如: 3. 面向对象基础语法 class Cat:def eat(self):print('小猫爱吃鱼')def drink(self):print ('小猫爱喝水' ...

  7. python全栈开发基础【第十七篇】面向对象反射和内置方法

    一.静态方法(staticmethod)和类方法(classmethod) 类方法:有个默认参数cls,并且可以直接用类名去调用,可以与类属性交互(也就是可以使用类属性) 静态方法:让类里的方法直接被 ...

  8. 面向对象进阶------内置函数 str repr new call 方法

    __new__方法: 我们来讲个非常非常重要的内置函数和init一样重要__new__其实在实例话对象的开始  是先继承父类中的new方法再执行init的  就好比你生孩子 先要把孩子生出来才能对孩子 ...

  9. 面向对象--内置方法

    __名字__ 类中的特殊方法\内置方法 双下方法 魔术方法 magic_method 类中的每一个双下方法都有它自己的特殊意义 1.__call__ 相当于 对象() class A:def __ca ...

  10. python 面向对象_多态、内置方法、反射

    内容: 1.接口思想 2.抽象类思想 3.多态 4.内置方法 5.反射 1.接口思想 建立关联的桥梁,方便管理代码 接口类:用来定义功能的类,位继承它的子类提供功能 该类的功能方法一般不需要实现体,实 ...

最新文章

  1. Nginx配置文件nginx.conf中文详解(转)
  2. spring WebServiceTemplate 调用 axis1.4 发布的webservice
  3. asp.net学习资源汇总
  4. boost::hana::test::TestSearchable用法的测试程序
  5. uCOS-II核心算法分析(μCOS-Ⅱ)
  6. 求1-100的所有数的和
  7. spark 获取广播变量_spark使用广播变量
  8. WebStorm 9“神器”变“霸器”
  9. 重庆自考学历计算机应用基础考试,2017年自考计算机应用基础模拟试题1
  10. 详解如何基于Arduino兼容板Digispark实现虚拟键盘与鼠标
  11. mybatis 查询
  12. 运筹学_单纯形法_week3
  13. Java Duration格式
  14. 双非普通一本大一学生学期末课设——运动会比赛计分系统
  15. python傅里叶逆变换_C# 傅里叶变换 逆变换 调用MathNet包|简明python教程|python入门|python教程...
  16. pb导入excel文件
  17. 没有申报就对房屋进行装修可以吗?
  18. word锁定:解决Word文档由于文档保护而无法修改、查找、编辑的方法
  19. Android蓝牙开发系列文章-蓝牙mesh(一)
  20. BAT前端老鸟总结:未来几年web前端发展四大趋势前瞻

热门文章

  1. PhysioBank 存档数据目录
  2. 2022年考研数据结构_3 栈和队列
  3. js数组常用方法总结(包括ES6)
  4. “21天好习惯”第一期-21
  5. spark 数据倾斜之两阶段聚合(局部聚合+全局聚合)
  6. linux下通过伪造udp包来实现指定网卡发送数据
  7. qmake构建项目详细讲解
  8. Java8函数式编程详解
  9. BZOJ 1833: [ZJOI2010]count 数字计数
  10. linux下apache+php配置