lonhy 发表于 2015-12-1 06:15:33

Python元类实践

  def myNamedTuple(tuple_name, attrs_str):
  class Meta(type):      #定义一个元类,采用`__call__`方法来拦截类的实例化,在实例化之前我们先把位置参数全部转入一个叫args的元组中,然后在调用type的`__call__`方法,从而把刚才的元组传进去,这样就只有一个参数了,从而无论你传入多少个位置参数,在这个步骤之后,只会出现一个参数了,成功!
  def __call__(self, *args):   
  return type.__call__(self, args)   
  attrs_set = set(attrs_str.split(' '))
  def __init__(self, args):
  for key, value in zip(attrs_set, set(args)):
  self.__dict__=value
  def __str__(self):
  values =
  return tuple_name+'(' + ', '.join(values) + ')'
  def to_dict(self):
  return self.__dict__
  return Meta(tuple_name, (tuple,),{'attr_keys':attrs_set,'__init__':__init__,'__str__':__str__,'to_dict':to_dict})
  
  if __name__=='__main__':
  Point = myNamedTuple('Point','x y')
  print(Point)
  p = Point(1,2)   #多个参数成功调用....
  print(p)
  print(type(Point),p, sep='\n')
  print(p.x,'---',p.y)
  print(p,p)
  print(p.to_dict)
  p +=(4,)      #此时已经变成了普通的tuple了。
  print(type(Point),p, sep='\n')
页: [1]
查看完整版本: Python元类实践