目录

Python开发之(二)-巧妙使用类

一、前言

  • 面向对象开发语言是当前开发语言的主流。

二、创建类时__init__与__call__的调用

  • 1、创建一个类

      class Hello:
        def __init__(self):
      	print("init")
        def __call__(self, *args, **kwargs):
      	print("call args %s kwargs %s" %(args,kwargs))
    
  • 当调用hello = Hello()时,init(self)方法被调用,也就是初始化方法,在生成类的实例时执行。

  • _call_ 这个方法很有趣,其作用是模拟()的调用,需要在实例上调用

  • 我们来改造下Hello类

      class Hello:
      	names = [];
      	def __init__(self,name):
      		self.names;
      		print("init");
      		self.names.append("hello %s!"%name);
      	def __call__(self, *args, **kwargs):
      		print("call args:%s and kwargs:%s"%(args,kwargs))
      		for name in args:
      			self.names.append("hello %s!" % name);
      		return self;
    
      hello1 =Hello("安杰");
      print(hello1.names);
      hello2 =hello1("angels");
      print(hello2.names);
    
      print(hello1);
      print(hello2);
    
      //调用结果
      init
      ['hello 安杰!']
      call args:('angels',) and kwargs:{}
      ['hello 安杰!', 'hello angels!']
      <__main__.Hello object at 0x100a39f60>
      <__main__.Hello object at 0x100a39f60>
    
  • 可以看到,_call_方法是调用Hello类的实例时,调用的,我们可以自由的选择是否需要有return语句来控制调用后是否有返回值

  • 当然,你也可以这样

      class Hello:
      	names = [];
      	def __init__(self,name):
      		self.names;
      		print("init");
      		self.names.append("hello %s!"%name);
      	def __call__(self, *args, **kwargs):
      		print("call args:%s and kwargs:%s"%(args,kwargs))
      		for name in args:
      			self.names.append("hello %s!" % name);
    
      hello =Hello("安杰");
      print(hello.names);
      hello("angels")
      print(hello.names);
      //调用结果
      init
      ['hello 安杰!']
      call args:('angels',) and kwargs:{}
      ['hello 安杰!', 'hello angels!']
    
  • 通过上面的例子,我们是否很容易就学习了_call__init_两个方法的使用以及类的定义形式