__repr__
1.触发时机:在使用repr转换对象的时候自动触发
2.作用:可以设置repr函数操作对象的结果
3.参数:一个self接受有当前对象本身
4.返回值:有必须是字符串
5.注意事项:正常情况下,类中的__str__和__repr__魔术方法是完全一样的(字符串中的str和repr魔术方法就不一样。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| class Human: color = '红色' age = 18 name = '梅花'
def __repr__(self): print('repr方法被触发') return 'repr返回的数据' def __str__(self): return 'str返回的数据'
def eat(self): print('海鲜真好吃~') def drink(self): print('啤酒很好喝')
jh = Human()
print(jh)
print(repr(jh))
mysong = '你\n吃饭\t了吗'
print(mysong) print(str(mysong))
print(repr(mysong))
mylist = [1,2,3,3,54,5,5] print(str(mylist)) print(repr(mylist))
|
__bool__
1.触发时机:使用bool() 转换对象的时候自动触发
2.作用: 用于检测对象成员的信息
3.参数:一个self接受当前对象
4.返回值:必须有且必须是布尔值
5.注意事项:无
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| class Man: color = '红色' age = 18 xb = '男' married = '未婚'
def __bool__(self): print('bool方法被触发') if self.married == '已婚': return True else: return False
def smoking(self): print('多数男人会抽烟') def say(self): print('男人就会打游戏')
mr = Man() print(mr)
result = bool(mr) print(result)
|
1.触发时机:使用字符串.format()格式化字符串的时候自动触发
2.作用:自定义字符串的输出格式
3.参数:一个self接受当前对象,一个arg接受限定符号的字符串
4.返回值:有必须是字符串
5.注意事项:无
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| class Girl: name = '熊初墨' xb = '女' age = 18
def __format__(self,arg):
flag = arg fillchar = flag[0] align = flag[1] length = int(flag[2:]) if align == '>': newname = self.name.rjust(length,fillchar) return newname elif align == '^': newname = self.name.center(length,fillchar) return newname elif align == '<': newname = self.name.ljust(length,fillchar) return newname else: return ''
def shopping(self): print('买买买~~') def eat(self): print('吃烧烤~')
xcm = Girl() print(xcm)
action = '我和我的闺蜜{:$<30}去逛街' result = action.format(xcm) print(result)
|
属性相关的魔术方法
就是获取成员,删除成员,修改成员相关联的魔术方法而已.
5个与属性相关的魔术方法:
1.__getattr__
2.__setattr__
3.__delattr__
4.__getattribute__
5.__dir__
属性访问的顺序:
1.调用__getattribute__
2.【调用数据描述符】
3.调用当前对象的所属成员
4.调用类的所属成员
5.【调用非数据描述符】
6.调用父类的所属成员
7.调用__getattr__
注意:以上步骤是调用某个成员的访问顺序及优先级。前面的能获取成员,就不会向后查找
__getattribute__
触发时机:访问对象成员的时候就会触发,无论成员是否存在
作用:可以在用户获取数据的时候进行数据处理等操作
参数:一个self接受当前对象,另外一个参数接受访问对象成员名称的字符串
返回值:有 不设定返回None
注意事项:在当前魔术方法中禁止使用当前对象.成员的方式访问成员,会触发递归操作,必须借助object的__getattribute__来获取当前对象的成员
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| class Human: def __init__(self): self.name = '东方雪' self.xb = '男' self.age = 18
def __getattribute__(self, item): result = object.__getattribute__(self,item) newname = result[0] + '*' + result[-1] return newname
def eat(self): print('吃烧烤') def drink(self): print('喝啤酒')
ls = Human() print(ls)
print(ls.xb)
''' 叫号显示: 张三 -> 张*三 李大嘴 -> 李*嘴 '''
|