Python中的特殊成员和魔法方法

1.魔法属性

·  1.1__doc__魔法属性  表示类的描述信息

?
1
2
3
4
5
6
class Fo:
     """ 这是今天第一个魔术属性__doc__"""
     def func( self ):
         pass
 
print (Fo.__doc__)

  运行结果

?
1
这是今天第一个魔术属性__doc__

  1.2.__moudle__魔法属性  表示当前操作的对象在那个模块

?
1
2
3
4
5
6
7
8
dome1.py
 
 
# -*- coding:utf-8 -*-
 
class Person( object ):
     def __init__( self ):
         self .name = ' __moudle__'

  

?
1
2
3
4
5
6
dom2.py
 
from dome1 import Person
 
obj = Person()
print (obj.__module__) 

  运行结果

?
1
dome1

  1.3 __class__魔法属性   表示当前操作的对象的类是什么

?
1
2
3
4
5
6
7
8
dome1.py
 
 
# -*- coding:utf-8 -*-
 
class Person( object ):
     def __init__( self ):
         self .name = ' __moudle__'

  

?
1
2
3
4
5
6
dom2.py
 
from dome1 import Person
 
obj = Person()
print (obj.__class__) 

  运行结果

?
1
Person

2.魔法方法

  2.1 __init__ () 魔法方法   初始化类属性方法,通过类创建对象时,自动触发执行

?
1
2
3
4
5
6
7
class Person:
     def __init__( self , name):
         self .name = name
         self .age = 18
 
 
obj = Person( 'python' )<br>obj.name

  运行结果

?
1
python

  2.2 __del__() 魔法方法  当对象在内存中被释放时,自动触发执行

扫描二维码关注公众号,回复: 6695943 查看本文章
?
1
2
3
4
class Dome:
     def __del__( self ):
         print ( '类已经被删除' )
obj  = Dome()

  运行结果

?
1
类已经被删除

  2.3 __str__ () 魔法方法   打印 对象 时,默认输出该方法的返回值

?
1
2
3
4
5
class Dome:
     def __str__( self ):
         return 'python'
obj = Dome()
print (obj)

  运行结果

?
1
python

  2.4 __dict__() 魔法方法  类或对象中的所有属性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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__)
 
obj1 = Province( '山东' , 10000 )
print (obj1.__dict__)
 
 
obj2 = Province( '山西' , 20000 )
print (obj2.__dict__)

  运行结果

?
1
2
3
4
5
{ '__dict__' : <attribute '__dict__' of 'Province' objects>, '__module__' : '__main__' , 'country' : 'China' , '__doc__' : None , '__weakref__' : <attribute '__weakref__' of 'Province' objects>, 'func' : <function Province.func at 0x101897950 >, '__init__' : <function Province.__init__ at 0x1018978c8 >}
 
{ 'count' : 10000 , 'name' : '山东' }
 
{ 'count' : 20000 , 'name' : '山西' }

  2.6 __getitem__(),__setitem__(),__delitem__()魔法方法 用于索引操作,如字典。以上分别表示获取、设置、删除数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
 
class Dome( 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 = Dome()
 
result = obj[ 'R1' ]      # 自动触发执行 __getitem__
obj[ 'R2' ] = 'laotie'    # 自动触发执行 __setitem__
del obj[ 'R1' ]           # 自动触发执行 __delitem__

  运行结果

?
1
2
3
__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  由于这三个方法单独使用没作用,所以通常配合使用来实现某种功能

  2.7 __iter__()魔法方法 让一个对象变得可以迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.8 __next__()魔法方法 定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.9 __name__()魔法方法 

  这个魔法方法,并不作用于类(这里我把它归为魔法方法可能不够严谨),当前程序的名称

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
 
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)
if __name__ = = '__main__' :
     
     obj = Foo()
 
     result = obj[ 'R1' ]      # 自动触发执行 __getitem__
     obj[ 'R2' ] = 'python'    # 自动触发执行 __setitem__
     del obj[ 'R1' ]           # 自动触发执行 __delitem__

  运行结果

?
1
2
3
__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  注意,该方法所在的.py文件如果作为一个工具包引入时,它里面包括的代码不会被引入,通常作为开发人员的调试空间(为所欲为也不会被外界发现)

  2.10 __enter__(),__exit__() 魔法方法,上下文管理器时使用

  __enter__() 进入‘上文操作’,__exit__()进入下文操作

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class File ():
 
     def __init__( self , filename, mode):
         self .filename = filename
         self .mode = mode
 
     def __enter__( self ):
         print ( "进入了上文操作!" )
         self .f = open ( self .filename, self .mode)
         return self .f
 
     def __exit__( self , * args):
         print ( "进入了下文操作!" )
         self .f.close()

  当调用该类打开一个文件时,会自动调用__enter__()方法打开文件,但文件调用完成后会自动给调用__exit__()方法关闭文件,以免造成内存的浪费,顺便说下:with open() 方法的原理和这个自定义上下文管理器是一样的

由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充

 

·  1.1__doc__魔法属性  表示类的描述信息

?
1
2
3
4
5
6
class Fo:
     """ 这是今天第一个魔术属性__doc__"""
     def func( self ):
         pass
 
print (Fo.__doc__)

  运行结果

?
1
这是今天第一个魔术属性__doc__

  1.2.__moudle__魔法属性  表示当前操作的对象在那个模块

?
1
2
3
4
5
6
7
8
dome1.py
 
 
# -*- coding:utf-8 -*-
 
class Person( object ):
     def __init__( self ):
         self .name = ' __moudle__'

  

?
1
2
3
4
5
6
dom2.py
 
from dome1 import Person
 
obj = Person()
print (obj.__module__) 

  运行结果

?
1
dome1

  1.3 __class__魔法属性   表示当前操作的对象的类是什么

?
1
2
3
4
5
6
7
8
dome1.py
 
 
# -*- coding:utf-8 -*-
 
class Person( object ):
     def __init__( self ):
         self .name = ' __moudle__'

  

?
1
2
3
4
5
6
dom2.py
 
from dome1 import Person
 
obj = Person()
print (obj.__class__) 

  运行结果

?
1
Person

2.魔法方法

  2.1 __init__ () 魔法方法   初始化类属性方法,通过类创建对象时,自动触发执行

?
1
2
3
4
5
6
7
class Person:
     def __init__( self , name):
         self .name = name
         self .age = 18
 
 
obj = Person( 'python' )<br>obj.name

  运行结果

?
1
python

  2.2 __del__() 魔法方法  当对象在内存中被释放时,自动触发执行

?
1
2
3
4
class Dome:
     def __del__( self ):
         print ( '类已经被删除' )
obj  = Dome()

  运行结果

?
1
类已经被删除

  2.3 __str__ () 魔法方法   打印 对象 时,默认输出该方法的返回值

?
1
2
3
4
5
class Dome:
     def __str__( self ):
         return 'python'
obj = Dome()
print (obj)

  运行结果

?
1
python

  2.4 __dict__() 魔法方法  类或对象中的所有属性

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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__)
 
obj1 = Province( '山东' , 10000 )
print (obj1.__dict__)
 
 
obj2 = Province( '山西' , 20000 )
print (obj2.__dict__)

  运行结果

?
1
2
3
4
5
{ '__dict__' : <attribute '__dict__' of 'Province' objects>, '__module__' : '__main__' , 'country' : 'China' , '__doc__' : None , '__weakref__' : <attribute '__weakref__' of 'Province' objects>, 'func' : <function Province.func at 0x101897950 >, '__init__' : <function Province.__init__ at 0x1018978c8 >}
 
{ 'count' : 10000 , 'name' : '山东' }
 
{ 'count' : 20000 , 'name' : '山西' }

  2.6 __getitem__(),__setitem__(),__delitem__()魔法方法 用于索引操作,如字典。以上分别表示获取、设置、删除数据

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
 
class Dome( 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 = Dome()
 
result = obj[ 'R1' ]      # 自动触发执行 __getitem__
obj[ 'R2' ] = 'laotie'    # 自动触发执行 __setitem__
del obj[ 'R1' ]           # 自动触发执行 __delitem__

  运行结果

?
1
2
3
__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  由于这三个方法单独使用没作用,所以通常配合使用来实现某种功能

  2.7 __iter__()魔法方法 让一个对象变得可以迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.8 __next__()魔法方法 定义一个迭代器,让其能够通过next(迭代对象的迭代器)对一个可迭代对象进行迭代

  由于前面迭代器已经进行了详细的说明,如果有疑问的朋友可以翻下我关于迭代器的博客

  2.9 __name__()魔法方法 

  这个魔法方法,并不作用于类(这里我把它归为魔法方法可能不够严谨),当前程序的名称

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# -*- coding:utf-8 -*-
 
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)
if __name__ = = '__main__' :
     
     obj = Foo()
 
     result = obj[ 'R1' ]      # 自动触发执行 __getitem__
     obj[ 'R2' ] = 'python'    # 自动触发执行 __setitem__
     del obj[ 'R1' ]           # 自动触发执行 __delitem__

  运行结果

?
1
2
3
__getitem__ R1
__setitem__ R2 python
__delitem__ R1

  注意,该方法所在的.py文件如果作为一个工具包引入时,它里面包括的代码不会被引入,通常作为开发人员的调试空间(为所欲为也不会被外界发现)

  2.10 __enter__(),__exit__() 魔法方法,上下文管理器时使用

  __enter__() 进入‘上文操作’,__exit__()进入下文操作

  

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class File ():
 
     def __init__( self , filename, mode):
         self .filename = filename
         self .mode = mode
 
     def __enter__( self ):
         print ( "进入了上文操作!" )
         self .f = open ( self .filename, self .mode)
         return self .f
 
     def __exit__( self , * args):
         print ( "进入了下文操作!" )
         self .f.close()

  当调用该类打开一个文件时,会自动调用__enter__()方法打开文件,但文件调用完成后会自动给调用__exit__()方法关闭文件,以免造成内存的浪费,顺便说下:with open() 方法的原理和这个自定义上下文管理器是一样的

由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充

猜你喜欢

转载自www.cnblogs.com/ZKPython/p/11115448.html