函数重写(override/overwrite)


  函数重写(override/overwrite) 

函数重写

作用:
  让自定义的实例像内建对象一样   ,  进行函数操作

对象转字符串函数重写:
  repr(obj)  返回一个能代表此对象的表达式字符串,通常:
      eval(repr(obj)) == obj
  str(obj)  通过给定的对象返回一个字符串(这个字符串通常是给人来阅读的)

函数重写(override/overwrite)

ex:

函数重写(override/overwrite)


对象转字符串函数的两个重写方法:
  1 repr() 函数的重写方法:
      def __repr__(self):
  2 str() 函数的重写方法:
      def __str__(self):
      如果没有__str__(self) 方法, 则返回repr(obj),函数结果代替

repr 都是给电脑看的,返回的是一个 表达式

函数重写(override/overwrite)
函数重写(override/overwrite)

内建函数重写:

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


函数重写(override/overwrite)


len函数和 reversed函数示例
函数重写(override/overwrite)
   实现MyList类的列表反回函数reversed(x) 函数的重写
   __reversed__(self),实现定义列表的反转


函数重写(override/overwrite)

__?????__ 标识符 通常有特殊的含义


数值转换函数的重写
    complex(obj)   ===> __complex__ 方法 
    int(obj)       ===> __int__     方法 
    float(obj)     ===> __float__   方法 
    bool(obj)      ===> __bool__    方法 
ex:
函数重写(override/overwrite)



布尔测试运算符重写:
格式:
  def __bool__(self):
      ....
作用:
  1. 用于bool(obj) 函数取值
  2. 用于if 语句的真值表达式中
  3. 用于while语句的真值表达式中
说明:
  当没有__bool__(self) 方法时,真值测试将以__len__(self) 方法的返回值来测试布尔值
函数重写(override/overwrite)



对象属性管理函数:
  1. getattr(obj, name[, default]) 从一个对象得到对象的属性,getattr(x, 'y') 等同于x.y,当属性不存在时,如果给出default参数,则返回default, 否则会产生一个AttributeError错误
  2. hasattr(obj, name)  用给定的name 返回对象obj是否有此属性,此种做法可以避免在getattr(obj,name) 时引发错误
  3. setattr(obj, name, value)  给对象obj的名为name的属性设置相应的值value, set(x, 'y', v)  等同于 x.y = v
  4. delattr(obj, name) 删除对象obj中的name属性,delattr(x, 'y') 等同于 del x.y
函数重写(override/overwrite)




del 语句 最终总结:
    1) 删除变量
    2) 删除列表中的元素
    3) 删除字典中的键值对
    4) 删除对象的实例变量(也叫属性)




属性管理的重写
  __getattr__(self, n)  ===> x.y 或 getattr(x,'y')
  __setattr__(self, n, v) ===> x.y = v
  __delattr__(self, n) ===> del x.y 或 delattr(x, 'y')
属性管理的作用:
  实现的特殊属性的管理,模似一些特殊属性
注:
  以上方法,当属性不存在时,需要触发一个AttributeError的错误
说明:
  __getattr__ 是在找不到对象对应属性时才调用, 当没有属性时,需要产生一个AttrubuteError错误


函数重写(override/overwrite)