第4章 魔法方法

04魔法方法

  • 钩子:特定时间发生时,能够为响应时间而调用的代码或函数;回调函数就算是钩子的一种类型。
0421 创建与销毁
  • __init__ 方法并不返回任何值,如果使用return 则会出现TypeError

  • __new____init__ 之前执行,用于创建并返回类的实例

    • 用于是静态的,无需显示装饰,第一个参数是创建实例所需要的类(习惯命名 cls

    • __new__方法的其它参数会被完整的复制到__init__中,参数在调用类构造函数时,首先会传递给__new__,然后才是__init__

    • 通过__new__方法返回当前类的实例时才会执行__init__方法

      class Myclass:
          
          def __new__(cls, *args, **kwargs):
              instance = super(Myclass, cls).__new__(cls, *args, **kwargs)
              # [do work on instance]
              return instance
      
  • __del__ 对象销毁时自动调用

0422 类型转换
  • __str__ 接受一个位置参数(self), 并在对象被传递给str的构造函数时,返回一个字符串

    class MyObject:
    
        def __str__(self):
            return "返回字符串"
    
        # def __unicode__(self):
        #     return u"unicode"
    
    print(str(MyObject()))
    print(u'The %s was used'%MyObject())
    
  • __bool__ __int__ __float__ __complex__

0423 比较
  • __eq__等于 __ne__不等于 (针对__eq__结果取反)

  • __lt__ __le__ __gt__ __ge__ 分别对应 < 、<=、 >、 >=

  • 操作重载

    • 二元操作符( + - 等)

      • 普通方法(vanilla method) x + y 匹配 x.__add__(y)
      • 取反方法(reverse method) 对于表达式x+y 如果没有__add__方法,则调用y.__radd__(x)
      • 即席方法(in-place method) 对于 x += y 调用 x.__iadd__(y)
    • 操作符方法取反即席
      +__add____radd____iadd__
      -__sub____rsub____isub__
      *__mul____rmul____imul__
      /__truediv____rtruediv____itruediv__
      //__floordiv____rfloordiv____ifloordiv__
      %__mod____rmod____imod__
      **__pow____rpow____ipow__
      &__and____rand____iand__
      |__or____ror__i__or__
      ^__xor____rxor__i__xor__
      <<__lshift____rlshift____ilshift__
      >>__rshift___r_rshift____irshift__
    • 一元操作符

      • __pos__(与+匹配) __neg__(与-匹配) __invert__(与~匹配)

        class ReversibleString:
        
            def __init__(self, s="The quick brown fox jumped over the lazy dogs"):
                self.s = s
        
            # def __invert__(self):
            #     return type(self)(self.s[::-1])
            def __invert__(self):
                return self.s[::-1] 
        
            def __str__(self):
                return self.s
        
        rs = ReversibleString()
        print(~rs)
        # print(~~rs)
        
    • 重载常见方法:将对象作为操作符。

      '''
      __len__
      __repr__:让对象成为更有用的代表值
      __hash__
      __format__
      __instancecheck__  __subclasscheck__
      __abs__  __round__
      '''
      
      class Timespan:
      
          def __init__(self, hours=0, minutes=0, seconds=0):
              self.hours = hours
              self.minutes = minutes
              self.seconds = seconds
      
          def __len__(self):
              return self.hours * 3600 + self.minutes * 60 + self.seconds
          
          def __repr__(self):
              return 'Timespan(hours={}, minutes={}, seconds={})'.format(self.hours, self.minutes, self.seconds)
      ts = Timespan(2, 30, 1)
      print(len(ts))
      print(ts)
      
      from datetime import datetime
      
      class MyDate(datetime):
          def __format__(self, format_spec):
              if not format_spec:
                  format_spec = "%Y-%m-%d %H:%M:%S"
              return self.strftime(format_spec)
      md = MyDate(2021, 12, 4, 20, 36)
      
      print("{}".format(md))
      print("{:%Y-%m-%d}".format(md))
      
  • 集合

    • __contains__

      from datetime import date
      
      class DateRange:
          def __init__(self, start, end):
              self.start = start
              self.end = end
      
          def __contains__(self, item):
              return self.start <= item <= self.end
      
      dr = DateRange(date(2015, 1, 1), date(2015, 12, 31))
      print(date(2015, 12, 12) in dr)
      
    • __getitem__ __setitem__ __delitem__

    • __getattr__ __setattr__

    • __getattribute__ 只有在无法找到属性时才被调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

壹如年少遲夏歸

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

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

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

打赏作者

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

抵扣说明:

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

余额充值