面向对象day08:类的特殊成员-类的起源与metaclass
Posted python运维自动化之路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象day08:类的特殊成员-类的起源与metaclass相关的知识,希望对你有一定的参考价值。
本节内容
1、__doc__
2、__module__和__class__
3、__init__
4、__del__
5 、__call__
6 、__dict__
7 、__str__
8 、__getitem__、__setitem__、__delitem__
前面我们讲了类的方法,有普通方法,就是我们自己定义的方法,还有静态方法,类方法,属性方法,其实类还有另外一种方法,叫做类的特殊成员方法
1 __doc__
说明:表示类的描述信息
1
2
3
4
5
6
7
8
9
10
11
|
class Dog( object ): """此类是形容Dog这个类""" #类的描述信息 def __init__( self ,name): self .name = name print (Dog.__doc__) #打印类的描述信息 #输出 此类是形容Dog这个类 |
2 __module__和__class__
说明:
- __module__: 表示当前操作的对象在哪个模块
- __class__:表示当前操作的对象的类是什么
aa.py的代码:
1
2
3
4
|
class C( object ): def __init__( self ): self .name = "shuaigaogao" |
index.py的代码:
1
2
3
4
5
6
7
8
9
10
|
from lib.aa import C obj = C() print (obj.__module__) #表示当前操作的对象在哪个模块 print (obj.__class__) #表示当前操作的对象的类是什么 #输出 lib.aa < class \'lib.aa.C\' > |
3 __init__
说明:构造方法,通过类创建对象时,自动触发执行
4 __del__
说明:析构方法,当对象在内存中被释放时,自动触发执行
1
2
|
注:此方法一般无须定义,因为Python是一门高级语言,程序员在使用时无需关心内存的分配和释放,因为此工作都是交给Python解释器来执行, 所以,析构函数的调用是由解释器在进行垃圾回收时自动触发执行的 |
5 __call__
说明: 对象后面加括号,触发执行
1
2
3
4
5
6
7
8
9
10
11
12
|
class Foo( object ): def __init__( self ): self .name = "shuaigaogao" def __call__( self , * args, * * kwargs): #重写call方法 print ( "running call" ,args,kwargs) f = Foo() #执行__init__ f( 1 , 2 , 3 ,name = 333 ) # 执行call方法,也可以写成 Foo()(1,2,3,name=333) #输出 running call ( 1 , 2 , 3 ) { \'name\' : 333 } |
注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()
6 __dict__
说明: 查看类或对象中的所有成员
①类.__dict__
效果:打印类中所有的属性,不包括实例属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class Province( object ): country = \'China\' def __init__( self , name, count): self .name = name self .count = count def func( self , * args, * * kwargs): print ( "func" ) print (Province.__dict__) #类.__dict__ #输出 { \'__doc__\' : None , \'__weakref__\' : <attribute \'__weakref__\' of \'Province\' objects>, \'__init__\' : <function Province.__init__ at 0x00000247F3CAD488 >, \'country\' : \'China\' , \'__dict__\' : <attribute \'__dict__\' of \'Province\' objects>, \'func\' : <function Province.func at 0x00000247F3CAD510 >, \'__module__\' : \'__main__\' } #打印类中所有的属性,不包括实例属性 |
②实例名.__dict__
效果:打印该实例的所有属性,不包括类属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Province( object ): country = \'China\' def __init__( self , name, count): self .name = name self .count = count def func( self , * args, * * kwargs): print ( "func" ) p = Province( "jiangsu" , 20000 ) #实例化 print (p.__dict__) #实例名.__dict__ #输出 { \'count\' : 20000 , \'name\' : \'jiangsu\' } #打印该实例的所有属性,不包括类属性 |
7 __str__
说明:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
class Province( object ): country = \'China\' def __init__( self , name): self .name = name def __str__( self ): return "<obj:{0}>" . format ( self .name) p = Province( "jiangsu" ) print (p) #打印这个对象 #输出 <obj:jiangsu> #给对象重新起了一个名字 |
注:这个以后会在django框架里面会用到,这边就不多说了
8 __getitem__、__setitem__、__delitem__
说明:用于索引操作,如字典。以上分别表示获取、设置、删除数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
class Foo( object ): def __getitem__( self , key): print ( \'__getitem__:\' ,key) def __setitem__( self , key, value): print ( \'__setitem__:\' ,key,value) def __delitem__( self , key): print ( \'__delitem__\' ,key) f = Foo() f[ "name" ] = "shuaigaogao" #自动触发__setitem__方法 f[ "name" ] #自动触发__getitem__方法 del f[ "name" ] #自动触发__delitem__方法 #输出 __setitem__: name shuaigaogao __getitem__: name __delitem__ name |
注:这边的__delitem__没有做真正的删除,只是触发这个方法,想要真正删除,只需要在__delitem__函数中添加删除功能即可
以上是关于面向对象day08:类的特殊成员-类的起源与metaclass的主要内容,如果未能解决你的问题,请参考以下文章