· 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() 方法的原理和这个自定义上下文管理器是一样的
由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充