欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

函数重写

程序员文章站 2022-05-07 13:03:09
...

基本概念

定义:

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

对象转字符串函数:

    repr(x) 返回一个能表示python 对象的表达式字符串,通常eval(repr(obj)) == obj

    str(x) 通过给定的对象返回一个字符串(这个字符串通常供人阅读)

    实例:

        s = "I'mStudent"
        print(str(s))   # I'mTeacher
        print(repr(s))  # 'I\'mTeacher'

对象转字符串函数的重写方法:

    repr() 函数的重写方法:
        del __repr__(self):
            return 字符串

    str() 函数的重写方法:
        del __str__(self):
            return 字符串

    str(obj) 函数调用方法说明:
        1.str(obj) 函数先查找obj.__str__(方法),调用此方法并返回结果
        2.如果obj.__str__()方法不存在,则调用obj.__repr__()方法并返回结果
        3.如果obj.__repr__方法不存在,则调用object类的__repr__实例方法显示
            <__main__.XXXX object at 0xXXXXXXXX>格式的字符串

    示例:

	class MyNumber:
	    def __init__(self, val):
	        self.data = val  # 在每个对象内部都创建一个实例变量来绑定数据
	
	    def __str__(self):
	        return "自定义数字%d" % self.data
	
	    def __repr__(self):
	        '''此方法返回的字符串一定是能表示self对象的表达式字符串'''
	        return "MyNumber(%d)" % self.data
	
	
	n1 = MyNumber(100)
	print(n1)  # 在print()内部会将n1用str(x)转为字符串再写到sys.stdo
	print('str(n1) =', str(n1))  # 自定义的数字:100
	print('repr(n1) =', repr(n1))  # MyNumber(100)

内建函数重写:

            方法名                     函数名
    def __abs__(self):              abs(obj)   函数调用
    def __len__(self):              len(obj)   函数调用
    def __reversed__(self):         reversed(obj)   函数调用
    def __round__(self):            round(obj)   函数调用

    实例:
    
	class MyList:
	    def __init__(self, iterable=()):
	        self.data = [x for x in iterable]
	
	    def __repr__(self):
	        return "MyList(%s)" % self.data
	
	    def __len__(self):
	        return len(self.data)
	
	    def __abs__(self):
	        # L = []
	        # for i in self.data:
	        #     L.append(abs(i))
	        # return "MyList(%s)" % L
	        return MyList([abs(x) for x in self.data])
	
	
	myl = MyList([1, -2, 3, -4])
	print(len(myl))
	print(abs(myl))

数值转换函数重写:

    def __complex__(self):          complex(obj) 函数调用
    def __int__(self):              int(obj)
    def __float__(self):            float(obj)
    def __bool__(self):             bool(obj)

    实例:
	
	 class MyNumber:
	    def __init__(self, val):
	        self.data = val
	
	    def __repr__(self):
	        return "MyNumber(%d)" % self.data
	
	    def __int__(self):
	        return int(self.data)
	
	    def __float__(self):
	        return float(self.data)
	
	
	n1 = MyNumber(100)
	n = float(n1)
	print(n)

布尔测试函数的重写:

    格式:

        def __bool__(self):
            ...

    作用:

        用于bool(obj)函数取值
        用于if语句真值表达式中
        用于while语句的真值表达式中

    说明:

        当自定义类内有__bool__(self)方法时,此方法的返回值为bool(x)的返回值

        当不存在__bool__(self)方法时,返回__len__(self)方法的返回值是否为非零
        来测试布尔值

        当不存在__len__(self)方法时,则直接返回True

对象的属性管理函数:

getatrr(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') 等同于 del x.y