博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python中的魔术属性与魔法方法
阅读量:6424 次
发布时间:2019-06-23

本文共 3670 字,大约阅读时间需要 12 分钟。

1.魔法属性

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

class Fo:    """ 这是今天第一个魔术属性__doc__"""    def func(self):        passprint(Fo.__doc__)

  运行结果

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

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

dome1.py# -*- coding:utf-8 -*-class Person(object):    def __init__(self):        self.name =' __moudle__'

  

dom2.pyfrom dome1 import Personobj = Person()print(obj.__module__)

  运行结果

dome1

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

dome1.py# -*- coding:utf-8 -*-class Person(object):    def __init__(self):        self.name =' __moudle__'

  

dom2.pyfrom dome1 import Personobj = Person()print(obj.__class__)

  运行结果

Person

2.魔法方法

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

class Person:    def __init__(self, name):        self.name = name        self.age = 18obj = Person('python') obj.name

  运行结果

python

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

class Dome:    def __del__(self):        print('类已经被删除')obj  = Dome()

  运行结果

类已经被删除

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

class Dome:    def __str__(self):        return 'python'obj = Dome()print(obj)

  运行结果

python

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

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__)

  运行结果

{'__dict__': 
, '__module__': '__main__', 'country': 'China', '__doc__': None, '__weakref__':
, 'func':
, '__init__':
}{'count': 10000, 'name': '山东'}{'count': 20000, 'name': '山西'}

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

 

# -*- 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__

  运行结果

__getitem__ R1__setitem__ R2 python__delitem__ R1

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

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

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

 

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

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

 

  2.9 __name__()魔法方法 

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

# -*- 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__

  运行结果

__getitem__ R1__setitem__ R2 python__delitem__ R1

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

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

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

  

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() 方法的原理和这个自定义上下文管理器是一样的

 

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

  

 

转载于:https://www.cnblogs.com/xuchuankun/p/9531862.html

你可能感兴趣的文章
TiDB 在 G7 的实践和未来
查看>>
重新认识javascript对象(三)——原型及原型链
查看>>
小学生学“数学”
查看>>
FastDFS蛋疼的集群和负载均衡(十七)之解决LVS+Keepalived遇到的问题
查看>>
深入剖析Redis系列(二) - Redis哨兵模式与高可用集群
查看>>
Android 用于校验集合参数的小封装
查看>>
iOS混合开发库(GICXMLLayout)七、JavaScript篇
查看>>
instrument 调试 无法指出问题代码 解决
查看>>
理解缓存
查看>>
BAT 经典算法笔试题 —— 磁盘多路归并排序
查看>>
Nginx限制带宽
查看>>
All Web Application Attack Techniques
查看>>
归档日志ORA-19809: 超出了恢复文件数的限制
查看>>
精品德国软件 UltraShredder 文件粉碎机
查看>>
PANDAS 数据合并与重塑(join/merge篇)
查看>>
文件时间信息在测试中的应用
查看>>
直播疑难杂症排查(8)— 播放杂音、噪音、回声问题
查看>>
如何写gdb命令脚本
查看>>
Android ListView展示不同的布局
查看>>
iOS宏(自己使用,持续更新)
查看>>