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() 方法的原理和这个自定义上下文管理器是一样的
由于前面的博客有些魔法方法已经做了解析,所以这次就没有进行详细的说明,所以可能有些魔法属性和魔法方法没有总结上去,欢迎大家补充
python中的魔术属性与魔法方法的更多相关文章
- 面向对象相关概念与在python中的面向对象知识(魔法方法+反射+元类+鸭子类型)
面向对象知识 封装 封装的原理是,其成员变量代表对象的属性,方法代表这个对象的动作真正的封装是,经过深入的思考,做出良好的抽象(设计属性时用到),给出“完整且最小”的接口,并使得内部细节可以对外透明( ...
- python中几个常见的魔法方法
首先,什么是魔法方法呢?在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做"魔法"方法. __ init__()方法 当一个实例被创建的时候调用的初始 ...
- Python中变量的属性以及判断方法
1.变量的属性 在Python中,创建一个变量会给这个变量分配三种属性: id ,代表该变量在内存中的地址: type,代表该变量的类型: value,该变量的值: x = 10 print(id(x ...
- Python笔记(二十六)_魔法方法_属性的魔法方法
属性的魔法方法 __getattribute__(self,name):当该类的属性被访问时,自动触发,是最先被触发的属性方法 __setattr__(self,name,value):当一个属性被设 ...
- Python中的私有属性私有方法、类属性类方法以及单例设计模式
私有属性是对象不希望公开的属性,私有方法是对象不希望公开的方法.在定义私有属性和私有方法时,在属性或者方法前,加上__(两个下划线) 公有方法可以通过对象名直接调用,私有方法不能通过对象名直接调用,只 ...
- Python学习笔记(七)——魔法方法
1.构造和析造 魔法方法就是被双下划线包围的方法 __init__()方法 __init__方法默认没有参数,返回值为none.类实例化对象需有明确的初始化步骤要重写函数 >>> c ...
- Python中的str与unicode处理方法
Python中的str与unicode处理方法 2015/03/25 · 基础知识 · 3 评论· Python 分享到:42 原文出处: liuaiqi627 的博客 python2.x中处理 ...
- python中的实例属性和类属性
在python中,类属性和实例属性的区别是什么? 我认为是作用域的不同,实例对象可以访问类属性,类对象不可以访问实例属性.(类的概念本身就是作用域的概念,你不能让一只猫会飞,猫属于猫类,这一类都不会飞 ...
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
随机推荐
- minst.npz下载
keras.datasets.mnist数据集下载地址 下载地址:链接: https://pan.baidu.com/s/1Rr-aHsIIEQx2z6W3qvMmhQ 提取码: 8w15
- DuiLib中FlashDemo的例子经验杂粹1
转载:https://www.jianshu.com/p/3e958ae9e5ab 最近用duilib做个东西,经常卡壳 ,而且以前学的现在又忘.现在觉得应该好好做笔记,以前老是觉得博客是很郑重的东西 ...
- Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2)D(树状数组)
//树状数组中数组的特性,有更巧妙的方法.//我们知道在树状数组中,对于数组tree[i],它所维护的区间为[i−lowbit(i)+1,i]//所以对于tree[2^i],它所维护的区间就为[1,2 ...
- nacos作为配置中心动态刷新@RefreshScope添加后取值为null的一个问题
之前springboot项目常量类如下形式: @Component @RefreshScope//nacos配置中心时添加上 public class Constants { @Value(" ...
- 使用myeclipse搭建简单的maven工程
请点击或者复制以下链接 http://opiece.me/2016/03/17/maven-and-ssmframework/
- 基于金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理
Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样. Git的强大之处在于,你可以在局域网内的任何一个共享路径下创建仓库,而不需要运行任何服务.所有的操作都是 ...
- iOS下JS与OC互相调用
背景情况: app项目中有几个界面是需要经常变动的(不仅是内容还有UI布局等),比如活动宣传界面就是属于这一类.但是由于AppStore提交审核也是需要时间的,就算审核快,也不至于每次都为了这点事频繁 ...
- JAVA关于回文判断的实现
(一). 设计思想: 首先输入字符串,然后判断长度若长度为0或1则输出TRUE若长度大于一则进行判断, 若符合条件则输出TRUE反之输出FALSE. (二)程序源代码 import java.util ...
- 2_01_MSSQL课程_查询
查询 1.查询结果的别名 列 as 别名 (建议用这种) 列 别名 别名=列 Select sum(score1) as 成绩1,sum(score2)as 成绩2 from talScore 2. ...
- C语言入门第四章
=========C语言的输入与输出=========== %-9d : d:以十进制输出,9表示至少占用9个字符的宽度,宽度不足以空格补齐,-表示左对齐.综合起来,%-9d 表示以十进制输出,左对齐 ...