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

2018-07-15  本文已影响14人  SecondRocker

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
上一篇 下一篇

猜你喜欢

热点阅读