Python3之方法的重写

本文详细介绍了Python3中如何重写内置函数,包括对象转字符串的`repr()`和`str()`方法,内建函数的重写,如布尔测试函数`__bool__()`,以及对象的属性管理函数`getattr()`、`hasattr()`、`setattr()`和`delattr()`。通过实例展示了如何自定义这些方法的行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数重写

内置函数的重写

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

对象转字符串函数:

  • 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

本节完

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秒不可闫M先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值