今日重要内容:
内置方法
1.__str__
2.__repr__
3.__format__
4.__call__
5.__eq__
6.__del__ (析构方法)
7.__new__
8.item 系列
共同:一下将的内置方法,object类中已经内置了,如果你不重构,则按照object类中的规则显示
1.__str__
2.__repr__
__str__和__repr__都是用于重构显示类中需要输出的内容,否则默认只是显示内存地址.
例: __str__
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,4,5,3) print(l) l.__str__() print(l.__str__()) print(str(l)) print('%s'%l) 结果: [1,2,4,5,3] [1,2,4,5,3] [1,2,4,5,3] [1,2,4,5,3]
例:__str__,__repr__
class Teacher: def __init__(self,name,age): self.name = name self.age = age def __str__(self): return "Teacher's object %s " %self.name def __repr__(self): return 'repr function %s' %self.name a = Teacher('alex',30) b = Teacher('egon',45) print(a) print(b) def repr(obj): return obj.__repr__() print(repr(a)) print(a.__repr__()) print('%r'%a) print(str(a)) 结果: Teacher's object alex Teacher's object egon repr function alex repr function alex repr function alex Teacher's object alex
总结:
1.__str__:,,,,,__repr__:
如果代码注销掉自定义的__str__和__repr__内容的时候,返回的是一堆内存地址:
例:
class Teacher: def __init__(self,name,age): self.name = name self.age = age # def __str__(self): # return "Teacher's object %s " %self.name # def __repr__(self): # return 'repr function %s' %self.name a = Teacher('alex',30) b = Teacher('egon',45) print(a.__str__()) print(a) print(b) def repr(obj): return obj.__repr__() print(repr(a)) print(a.__repr__()) print('%r'%a) print(str(a)) 结果: <__main__.Teacher object at 0x00000000027CA780> <__main__.Teacher object at 0x00000000027CA780> <__main__.Teacher object at 0x00000000027CA7F0> <__main__.Teacher object at 0x00000000027CA780> <__main__.Teacher object at 0x00000000027CA780> <__main__.Teacher object at 0x00000000027CA780> <__main__.Teacher object at 0x00000000027CA780>
2.__str__:,,,,,__repr__:
如果注销掉__str__方法,仍然可以打印出我们想要的内容.说明__repr__可以代替__str__的功能
例:
class Teacher: def __init__(self,name,age): self.name = name self.age = age # def __str__(self): # return "Teacher's object %s " %self.name def __repr__(self): return 'repr function %s' %self.name a = Teacher('alex',30) b = Teacher('egon',45) print(a.__str__()) print(a) print(b) def repr(obj): return obj.__repr__() print(repr(a)) print(a.__repr__()) print('%r'%a) print(str(a)) 结果 repr function alex repr function alex repr function egon repr function alex repr function alex repr function alex repr function alex
__str__和__repr__的用法:
print(obj) 的结果 是 obj.__str__()的结果
str(obj) 的结果 也是 obj.__str__()的结果
%s'%obj 的结果 也是 obj.__str__()的结果
repr(obj)的结果和obj.__repr__()是一样的
'%r'%(obj)的结果和obj.__repr__()是一样的
总结: #obj 表示类对象
当需要使用__str__的场景时找不到 __str__就找__repr__
当需要使用__repr__的场景时找不到__repr__的时候就找父类的repr
str() 的结果是依赖 obj.__str__()
print(obj) 的结果是依赖 obj.__str__()
%s 的结果是依赖 obj.__str__() # 语法糖
repr() 的结果是依赖 obj.__repr__()
%r 的结果是依赖 obj.__repr__()
repr是str的备胎
3.__format__ 类内的格式化输出 与format配合使用
class A: def __init__(self,name,school,addr): self.name = name self.school = school self.addr = addr def __format__(self, format_spec): return format_spec.format(obj=self) a = A('大表哥','oldboy','沙河') format_spec = '{obj.name}-{obj.addr}-{obj.school}' print(format(a,format_spec)) #固定格式输出 结果: 大表哥-沙河-oldboy
4. __call__
用途:类内设置__call__ 为了能够让对象使用对象名()调用__call__方法
例:
class Teacher(): #python3中表示继承object def __call__(self): print(123) def call(self):print(345) t = Teacher() t.call() t() 结果: 345 123
一个对象是否可调用 完全取决于这个对象对应的类是否实现了__call__
print(callable(Teacher))
print(callable(t))
5.__eq__() 与 == 相关联
作用:用来确认 类内相等的条件
例:
class A: def __eq__(self, other): return True a = A() a.name = 'alex' b = A() b.name = 'egon' print(a) print(b) print(a == b) 结果: <__main__.A object at 0x00000000027BA2B0> <__main__.A object at 0x00000000027BA748> True
结论:
== 是由__eq__的返回值来决定的
6.__del__ 析构方法
作用:在删除一个对象的时候做一些收尾工作
class A: def __init__(self): self.f = open('文件','w') def __del__(self): #默认在类外执行del 删除 对象a的时候先执行__del__ self.f.close() print('执行我了') a = A() del a print(a) print('111') 结果: 执行我了 Traceback (most recent call last): File "F:/Python-script-2/s11-day24/练习.py", line 82, in <module> print(a) NameError: name 'a' is not defined
结论:
__del__这个内置方法是自动执行的,不需要外部调用.所以称作析构方法.
7.__new__ 构造方法
作用:在实例化的时候优先执行__new__进行内存空间的构造,在__new__方法执行后,才会执行__init__赋值操作.
__new__处还有一个经典的设计模式叫做单例模式
单例模式就是创建不同的实例化对象,其实都是只有一个内存空间.
普通模式下,一个实例化就是一个内存空间,每个内存空间都是不同.
例:通过例子了解单例模式
class B: __instance = None def __new__(cls, *args, **kwargs): if cls.__instance is None: obj = object.__new__(cls) cls.__instance = obj return cls.__instance def __init__(self,name,age): self.name = name self.age = age def func(self): print(self.name) a = B('alex',45) b = B('agon',34) print(a) print(b) print(a.name) print(b.name)
结果:
<__main__.B object at 0x0000000001E8A7B8>
<__main__.B object at 0x0000000001E8A7B8>
agon
agon
8.item系列 #通过对象对item方法下的属性进行取值,赋值,修改和删除
__getitem__ #查看,得到
__setitem__ #修改
__delitem__ #删除
例
class Foo: def __init__(self,name): self.name=name def __getitem__(self,item): return self.__dict__[item] def __setitem__(self, key, value): self.__dict__[key]=value def __delitem__(self, key): print('del obj[key]时,我执行') self.__dict__.pop(key) f = Foo('alex') print(f['name']) # f.__getitem__('name') f['age'] = 18 # 赋值 print(f.age) # 自带的语法 print(f['age']) # 修改 f['age'] = 80 print(f['age']) # 通过实现__getitem__得到的 del f['age'] print(f.age) 结果: 18 18 80 del obj[key]时,我执行 File "F:/Python-script-2/s11-day24/练习.py", line 127, in <module> print(f.age) AttributeError: 'Foo' object has no attribute 'age'