美文网首页
python基础学习3(魔法方法)

python基础学习3(魔法方法)

作者: SecondRocker | 来源:发表于2018-07-15 23:28 被阅读14次

    python中以__(双下划线)开头的方法,有特殊的作用,称之为魔法方法:

    __init__

    此方法为类的构造方法,实例化对象时调用此方法。

    class A:
      def __init__(self):
        print('init A instance')
    
    A() #打印init A instance
    

    __str__

    print 类对象时打印的是此方法返回的字符串(必须返回字符串)

    class A:
      def __str__(self):
        return "customer str method"
    
    print(A()) #打印 customer str method
    

    __ repr__

    此方法对开发者有效,显示变量调用时打印此方法返回字符串(必须返回字符串)

    class A:
      def __repr__(self):
        return '<this is a instance of A>'
    
    A() #打印<this is a instance of A>
    

    __iter__,__next__

    提供这两个方法可使对象能实现for ... in 循环,__iter__返回可迭代对象,此对象的__next__ 方法拿到循环的下一个值

    class A:
      def __iter__(self):
        return B([1,2,3])
    
    class B:
      def __init__(self,arr):
        self.arr = arr
        self.index = -1
      def __next__(self):
        self.index += 1
        if self.index > len(self.arr) - 1: # 退出循环的条件
          raise StopIteration()
        return self.arr[self.index]
    
    for i in A():
      print(i) #打印 1,2,3
    

    __getitem__

    此方法会在凋用索引方法时调用,取到第n个元素

    class Fib:
      def __getitem__(self,n):
        a,b = 1,1
        if isinstance(n,int):
          for i in range(n):
            a,b = b,a+b
          return a
        if isinstance(n,slice):
          rtn = []
          start,stop = n.start,n.stop
          if start is None:
            start = 0
          for i in range(stop):
            if(i >= start):
              rtn.append(a)
            a,b = b,a+b
          return rtn
    
    print(Fib()[3]) #打印3
    print(Fib()[0:3]) #打印 1,1,2
    

    __getattr__

    此方法类似于ruby 的method_missing,在调用未定义的方法、属性时会调用此方法:

    class A:
      def __getattr__(self,name):
        if name == 'action':
            return lambda : "%s method is call" % name
        return "%s attribute is call" % name
    
    print(A().action()) # action method is call
    print(A().aaa) #aaa attribute is call
    #可在方法内raise AttributeError 对不干涉的方法、属性报错
    

    __call__

    可使对象变成可调用方法

    class A:
      def __call__(self):
        print("call as a method")
    
    A()() #call as a method
    A()# 这种对象叫做Callable对象,可用callable方法判断 是否是该类对象
    print(callable(A())) #True
    

    相关文章

      网友评论

          本文标题:python基础学习3(魔法方法)

          本文链接:https://www.haomeiwen.com/subject/qtdmpftx.html