您的位置:首页 > 编程语言 > Python开发

python-面向对象(三)——类的特殊成员

2016-04-11 11:59 543 查看

类的特殊成员

1.__doc__

表示类的描述信息

classFoo: """描述类信息,这是用于看片的神奇""" deffunc(self): pass printFoo.__doc__ ============== 描述类信息,这是用于看片的神奇

[b]2.__module__和__class__[/b]

[b] __module__表示当前操作的对象在哪个模块[/b]
[b]__class__表示当前操作的对象的类是什么[/b]

[b][b]3.__init__[/b][/b]

构造方法,通过类创建对象时,自动触发执行。


classFoo: def__init__(self,name): self.name=name self.age=18 obj=Foo('wupeiqi') #自动执行类中的__init__方法

  

4.__del__

析构方法,当对象在内存中被释放时,自动触发执行。

注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行,所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的。

classFoo: def__del__(self): pass

5.__call__

  对象后面加括号,触发执行。

[b]注:构造方法的执行是由创建对象触发的,即:对象=类名();而对于__call__方法的执行是由对象后加括号触发的,即:对象()或者类()()[/b]

classFoo: def__init__(self): passdef__call__(self,*args,**kwargs): print'__call__' obj=Foo()#执行__init__ obj()#执行__call__

6.__dict__

  类或对象中的所有成员
  上文中我们知道:类的普通字段属于对象;类中的静态字段和方法等属于类,即:



classProvince: country='China' def__init__(self,name,count): self.name=name self.count=count deffunc(self,*args,**kwargs): print'func' #获取类的成员,即:静态字段、方法... printProvince.__dict__ #输出: {'country':'China','__module__':'__main__','func':<functionfuncat0x10be30f50>,'__init__':<function__init__at0x10be30ed8>,'__doc__':None} #获取对象obj1的成员 obj1=Province('HeBei',10000) printobj1.__dict__ #输出:{'count':10000,'name':'HeBei'}

7.__str__

如果一个类中定义了__str__方法,那么在打印对象时,默认输出该方法的返回值。

classFoo: def__str__(self): return'wupeiqi' obj=Foo() printobj #输出:wupeiqi

8、__getitem____setitem____delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

#!/usr/bin/envpython #-*-coding:utf-8-*- classFoo(object): def__getitem__(self,key): print'__getitem__',key def__setitem__(self,key,value): print'__setitem__',key,value def__delitem__(self,key): print'__delitem__',key obj=Foo() result=obj['k1']#自动触发执行__getitem__ obj['k2']='wupeiqi'#自动触发执行__setitem__ delobj['k1']#自动触发执行__delitem__

9、__getslice__、__setslice__、__delslice__

该三个方法用于分片操作,如:列表slice:切片切割

#!/usr/bin/envpython #-*-coding:utf-8-*- classFoo(object): def__getslice__(self,i,j): print'__getslice__',i,j def__setslice__(self,i,j,sequence): print'__setslice__',i,j def__delslice__(self,i,j): print'__delslice__',i,j obj=Foo() obj[-1:1]#自动触发执行__getslice__ obj[0:1]=[11,22,33,44]#自动触发执行__setslice__ delobj[0:2]#自动触发执行__delslice__

10.__iter__

用于迭代器,之所以列表、字典、元组可以进行for循环,是因为类型内部定义了__iter__


第一步:

classFoo(object): pass obj=Foo() foriinobj: printi #报错:TypeError:'Foo'objectisnotiterable可迭代的

第二步:

#!/usr/bin/envpython #-*-coding:utf-8-*- classFoo(object): def__iter__(self): pass obj=Foo() foriinobj: printi #报错:TypeError:iter()returnednon-iteratoroftype'NoneType'

第三步:

#!/usr/bin/envpython #-*-coding:utf-8-*- classFoo(object): def__init__(self,sq): self.sq=sq def__iter__(self): returniter(self.sq) obj=Foo([11,22,33,44]) foriinobj: printi

以上步骤可以看出,for循环迭代的其实是iter([11,22,33,44]),所以执行流程可以变更为:

#!/usr/bin/envpython #-*-coding:utf-8-*- obj=iter([11,22,33,44]) foriinobj: printi For循环语法内部 #!/usr/bin/envpython #-*-coding:utf-8-*- obj=iter([11,22,33,44]) whileTrue: val=obj.next() printval

  

11.__new__和__metaclass__

阅读以下代码:

classFoo(object): def__init__(self): pass obj=Foo()#obj是通过Foo类实例化的对象

上述代码中,obj是通过Foo类实例化的对象,其实,不仅obj是一个对象,Foo类本身也是一个对象,因为在Python中一切事物都是对象。

如果按照一切事物都是对象的理论:obj对象是通过执行Foo类的构造方法创建,那么Foo类对象应该也是通过执行某个类的构造方法创建。

printtype(obj)#输出:<class'__main__.Foo'>表示,obj对象由Foo类创建 printtype(Foo)#输出:<type'type'>表示,Foo类对象由type类创建

所以,[b]obj对象是Foo类的一个实例Foo类对象是type类的一个实例,即:Foo类对象是通过type类的构造方法创建。[/b]

那么,创建类就可以有两种方式:

a).普通方式

classFoo(object): deffunc(self): print'hellowupeiqi'


b).特殊方式(type类的构造函数)


deffunc(self):
print'hellowupeiqi'

Foo=type('Foo',(object,),{'func':func})
#type第一个参数:类名
#type第二个参数:当前类的基类
#type第三个参数:类的成员

  ==》类是由type类实例化产生


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: