函数重写

内置函数的重写

定义:在自定义类内部添加相应的方法,让自定义类创建的实例能够使用内建函数进行操作。

对象转字符串函数:

  • repr(x)函数:返回一个能表示python对象的表达式字符串,通常evel(repr(obj))==obj
  • str(x) 通常给定的对象返回一个字符串(这个字符串通常供人阅读)
    举个栗子:
>>> s = "I'mstudent"
>>> print(str(s))
I'mstudent
>>> print(repr(s))
'I\'mstudent'

对象转字符串重写方法

  1. repr()函数的重写方法
def __repr__(self):
	return 字符串
  1. 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

本节完