python中的魔术属性与魔法方法
1.魔法属性
· 1.1__doc__魔法属性 表示类的描述信息
class Fo:
""" 这是今天第一个魔术属性__doc__"""
def func(self):
pass print(Fo.__doc__)
运行结果
这是今天第一个魔术属性__doc__
1.2.__moudle__魔法属性 表示当前操作的对象在那个模块
dome1.py # -*- coding:utf-8 -*- class Person(object):
def __init__(self):
self.name =' __moudle__'
dom2.py from dome1 import Person obj = Person()
print(obj.__module__)
运行结果
dome1
1.3 __class__魔法属性 表示当前操作的对象的类是什么
dome1.py # -*- coding:utf-8 -*- class Person(object):
def __init__(self):
self.name =' __moudle__'
dom2.py from dome1 import Person obj = Person()
print(obj.__class__)
运行结果
Person
2.魔法方法
2.1 __init__ () 魔法方法 初始化类属性方法,通过类创建对象时,自动触发执行
class Person:
def __init__(self, name):
self.name = name
self.age = 18 obj = 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__': <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__()魔法方法 用于索引操作,如字典。以上分别表示获取、设置、删除数据
# -*- 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() 方法的原理和这个自定义上下文管理器是一样的
由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充
最新文章
- linux有关信号的FAQ
- Asp.Net Core 项目搭建 基础配置 和MySql 的使用
- 创建16x16二级hash目录
- LightOJ 1104
- disconf系列【1】——百度disconf在ubuntu14.04环境下的安装
- SAP模块常用增强总结{转载}
- jquery.easypiechart.js简介
- 【转】Bootloader之uBoot简介(转)
- easyui grid中翻页多选方法
- python编写telnet登陆出现TypeError:&#39;str&#39; does not support the buffer interface
- C# WebBrowser准确判断网页最终装载完毕
- TCP恋爱史:三次握手和四次分手
- libeXosip2(1-1) -- How-To initialize libeXosip2.
- Initialising Memories
- Linux安装SVN服务器
- 455. Assign Cookies.md
- 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)
- linux的文档和目录结构
- Python3练习题 018:打印星号菱形
- No compiler is provided in this environment. --Maven build失败