str与repr并不存在优先级,本质上执行print就是在调用系统的__str__方法,而repr作用在python编辑器中,所以只用在str不存在时,print会找repr来顶替使用
实现代码如下:
1 class Run:
2 def __init__(self,name,age):
3 self.name=name
4 self.age=age
5 # def __str__(self):
6 # return '这是str的 名字叫%s年龄是%s'%(self.name,self.age)
7
8 def __repr__(self): #python解释器调用的
9 return '这是repr的 名字叫%s年龄是%s' % (self.name, self.age)
10
11 r1=Run('Kevin',23)
12 print(r1) #本质上执行print就是在调用__str__方法
但不管如何,返回值必须为字符串类型,否则直接抛异常
format下面使用的字典或者变量不要与它重名
参考下面的示例:
1 class Foo:
2
3 def __init__(self,year,mon,day):
4 self.year=year
5 self.mon=mon
6 self.day=day
7
8 def __format__(self, format_spec):
9 print('*****************')
10 # print(format_spec)
11 # print(self.year)
12
13 fm=mat[format_spec]
14 return fm.format(self)
15
16 f1=Foo(2018,7,2)
17 print(format(f1,'dmy'))
18 print(format(f1,'y-m-d'))
19 print(format(f1,'m:d:y'))
20
21 print('{0}年{1}月{2}日'.format(2018,7,2))
__slots__用来强行限定类的实例化对象能拥有的属性,超出的会报错
1 class Roo:
2 __slots__ = ['name','age']
3 # __slots__ = 'name'
4 rt=Roo()
5 rt.name='tom'
6 rt.age=18
7 # rt.sex='man'
8 # print(rt.__dict__)
9 print(Roo.__slots__)
10 print(rt.__slots__)
11 print(rt.name,rt.age)
__doc__不会被子类继承,默认存在且值为None
析构函数__del__主要是在垃圾回收内存清理时会触发,如果仅仅是删除对象的元素属性,则不会触发
实现代码:
1 class Realy:
2 def __del__(self):
3 print('执行我了')
4
5 re=Realy()
6
7 re.name='tom'
8 del re.name #不会触发del
9 del re #会触发del
10 print('******************')
对象后面加括号,可以调用类里面的__call__方法 (如s1.() )