python魔术方法注意事项

new

  • 永远是静态方法
  • 需要一个返回值,如果返回值不是cls的实例,则不会调用__init__
  • 返回值一般是实例对象,需要调用object来实例化对象,则返回值必然是super().new(cls)

str

  • 可视化方法,用字符串的可视方式展示,但是本质不是字符串
  • str()、format()、print()的三个函数直接调用__str__,如果没有__str__则去调用__repr__

repr

  • 可视化方法,对一个对象用字符串可视化方式表达
  • 除str()、format()、print()三个方法都直接调用__repr__
    如果父类没有,则按照该规则与继承规则往上找

bytes

  • 返回一个bytes对象,如果需要bytes返回,则一定要return bytes对象

hash

  • 返回一个整数,如果有该方法,则实例就可以哈希
  • set去重需要满足两个条件,一是可hash,二是两个值需要内容相等,内容相等则需要调用__eq__方法
  • 如果类中没有__eq__方法,则在==比较时默认比较的id值

eq

  • 判断两个对象内容是否相等
  • 类中有了__eq__,就必须有__hash__定义,否则该类的实例都不可以hash
  • list中定义了 def hash(self): return None 所以list不能hash

bool

  • 定义实例的bool类型
  • 返回值只能是False或者True
  • 如果没有定义,则找__len__,非0为真

运算法重载

  • 如果没有__isub__则,-=的运算符会找__sub__

__isub__与__sub__的区别

  • sub是进行相减并返回了新的值,返回新值后将原值覆盖 类似于 a.attr = a.attr b.attr
  • isub是先进行相减,但是最后return了self,但是属性做了变化,类似于
  • a.attr = a.attr - b.attr
    return self
  • list 的+=类似于调用了extend()方法,并作为返回值
  • 不可变类型,+=调用的=

enter__与__exit

  • with上下文管理器在进入时会调用__enter__方法,执行结束后会执行__exit__方法,with语句块中异常都不会打破__exit__的执行
  • with语句会调用__enter__方法,如果有as,将该方法的返回值赋值给as子句的变量
posted @ 2020-08-07 21:38  zoer  阅读(166)  评论(0编辑  收藏  举报