函数重写
内置函数的重写
定义:在自定义类内部添加相应的方法,让自定义类创建的实例能够使用内建函数进行操作。
对象转字符串函数:
- repr(x)函数:返回一个能表示python对象的表达式字符串,通常evel(repr(obj))==obj
- str(x) 通常给定的对象返回一个字符串(这个字符串通常供人阅读)
举个栗子:
>>> s = "I'mstudent"
>>> print(str(s))
I'mstudent
>>> print(repr(s))
'I\'mstudent'
对象转字符串重写方法
- repr()函数的重写方法
def __repr__(self):
return 字符串
- str()函数的重写方法
def __str__(self):
return 字符串
str(obj)函数调用方法说明:
- str(obj)函数先查找obj.str(方法),调用此方法并返回结果
- 如果obj.str()方法不存在,则调用obj.repr()方法并返回结果,如果还不存在,则调用object类的__repr__实例方法显示<main.xxxx object at 0xXXXXXX>格式的字符串。(双下划线打不出来,气死人了,加黑的都是前后双下划线)
举个重写的方法的栗子:
class MyNumber:
def __init__(self, val):
self.data = val # 在每个对象内部都创建一个实例
# 变量来绑定变量
n1 = MyNumber(100)
print('str(n1)={}'.format(str(n1)))
print('repr(n1)={}'.format(repr(n1)))
n2 = MyNumber(200)
print(str(n2))
print(n2)
此时会调用object的方法
打印结果如下:
str(n1)=<__main__.MyNumber object at 0x7fdb59532748>
repr(n1)=<__main__.MyNumber object at 0x7fdb59532748>
<__main__.MyNumber object at 0x7fdb595326d8>
<__main__.MyNumber object at 0x7fdb595326d8>
用重写的方法,调用自己写的就可以了
重写后的代码是:
class MyNumber:
def __init__(self, val):
self.data = val # 在每个对象内部都创建一个实例
# 变量来绑定变量
def __str__(self):
return '自定义数字{}'.format(self.data)
def __repr__(self):
'''返回的字符串一定是能表示self对象的表达式字符串'''
return 'MyNumber({})'.format(self.data)
n1 = MyNumber(100)
print('str(n1)={}'.format(str(n1)))
print('repr(n1)={}'.format(repr(n1)))
n2 = MyNumber(200)
print(str(n2)) # 使用内置方法调用方法调用重写方法
print(n2.__str__()) # 直接调用重写方法
print(n2) # 在print内部会将n2用str(x)转为字符串再写到sys.stdout
打印结果是:
str(n1)=自定义数字100
repr(n1)=MyNumber(100)
自定义数字200
自定义数字200
自定义数字200
####内建函数的重写:
方法名(双下划线打不出来,加粗的既是) | 函数名(调用方法) | 含义 |
def abs(self): | add(x) | 绝对值 |
def len(self): | add(x) | 长度 |
def reversed(self): | add(x) | 反序 |
def round(self): | add(x) | 四舍五入 |
class MyList:
'''这是一个自定义的列表类型,此类型的对象用data属性绑定的列表来存储数据'''
def __init__(self, iterable=()):
self.data = [x for x in iterable]
def __repr__(self):
return 'MyList({})'.format(self.data)
def __len__(self):
return len(self.data)
def __abs__(self):
L = [abs(x) for x in self.data]
return MyList(L)
myl = MyList([1, -2, 3, -4])
print(myl)
print(len(myl))
print(abs(myl))
# 结果:
# MyList([1, -2, 3, -4])
# 4
# MyList([1, 2, 3, 4])
####数值转换函数的重写:
方法名 | 函数名 | 含义 |
def complex(self): | complex(obj) | 复数 |
def int(self): | complex(obj) | 整型 |
def float(self): | complex(obj) | 浮点型 |
def bool(self): | complex(obj) | 布尔型 |
class MyNumber:
def __init__(self, val):
self.data = val
def __str__(self):
return '自定义数字{}'.format(self.data)
def __repr__(self):
'''返回的字符串一定是能表示self对象的表达式字符串'''
return 'MyNumber({})'.format(self.data)
def __int__(self):
return int(self.data)
def __float__(self):
return float(self.data)
def __bool__(self):
return bool(self.data)
n1 = MyNumber(100)
n = int(n1)
print(n)
n = float(n1)
print(n)
print(bool(n1))
# 结果是:
# 100
# 100.0
# True
布尔测试函数的重写:
作用:
- 用于bool(obj)函数取值
- 用于if语句真值表达式
- 用于while语句的真值表达式
说明:
- 当自定义类内有__bool__(self)方法时,此方法的返回值作为bool(x)的返回值
- 当不存在__bool__(self)方法时,返回__len__(self)方法的返回值,如果返回值非0,则测试布尔值返回True
- 当不存在__len__(self)时,则直接返回True
对象的属性管理函数:
getattr(obj, name[,default])
从一个对象用字符串name得到对象的属性,getattr(x, ‘y’)等同于x.y;当属性不存在时,如果给定default参数,则返回default,如果没有给定default则触发一个AttributeError错误
hasattr(obj, name)用给定的name字符串返回obj是否有此属性,此种做法可以避免getattr(obj, name)时引发错误
setattr(obj, name, value),给对象obj的名为name的属性设置相应的value值,setattr(x, ‘y’, v)等同于x.y = v
delattr(obj, name)删除对象obj中的name属性,del(x, ‘y’)等同于delattr x.y
本节完