Python基础之魔术方法(控制属性的访问和设置)
# 魔术方法--常规方法
# 1. __int__ 构造函数
# 2. __new__ 在类实例之前就创建了
# 3. __iter__ 迭代器
# 4. __del__ 析构方法,用来清除释放的对象内存
# 5. __class__ 魔术属性,返回所有的类--元类
# 6. __str__ 返回类+属性
# 7. __repr__ 返回类+属性,与__str__类似
# 8. __dict__ 返回类属性和对应的属性值,存储在字典中
# 9. dir() 返回当前类的属性和python内置属性,但不显示当前类属性的属性值
class Person(object):
def __new__(cls, *args, **kwargs):
return object.__new__(cls)
def __init__(self,name):
self.name = name
self.Address = 'SZ'
def __str__(self):
return 'Person<%s>'%self.name
def __repr__(self):
return 'Person<%s>'%self.Address
son = Person('MI')
P = Person('Oppo')
a = [son,P]
print(son)
print(a)
print(P.__dict__) # 返回{'name': 'Oppo', 'Address': 'SZ'}
print(dir(son)) # 返回当前对象的属性和系统Python的内置属性
# super的用法
# class A(object):
# def __init__(self,name):
# self.name = name
# print('HI:%s'%self.name)
#
# class B(A):
# def __init__(self,name):
# super(B, self).__init__(name)
# print('打印子类: %s'%self.name)
#
# b = B("Huawei")
'''
__getattr__魔术方法:
在访问一个对象的某个属性的时候,如果这个属性不存在,那么就会执行__getattr__方法,将属性的名字传进去。
如果这个属性存在,那么就不会调用__getattr__方法:
'''
class Person(object):
def __init__(self,name):
self.name = name
def __getattr__(self, attr):
# 注释: attr表示访问不存在的属性
if attr == 'age':
print('打印出__getattr__')
return self.name
else:
return None
p1 = Person('Teacher')
print(p1.name)
print("__getattr访问属性返回的值:{}".format(p1.age)) # 访问对象不存在的属性
'''
__setattr__
只要给一个对象的属性设置值,那么就会调用这个方法。
但是要注意的是,不要在这个方法中调用self.xxx=xxx的形式,因为会产生递归调用。
如果想要给对象的属性设置值,那么应该使用__dict__这个魔术属性。
'''
class Father(object):
def __init__(self,name,age):
self.name = name
self.age = age
def __setattr__(self, key, value):
print('打印出__setattr__')
self.__dict__[key] = value
fa = Father('Teache','20')
fa.name = "Tao"
'''
__getattribute__
这个魔术方法是,只要你访问了一个对象的属性,不管这个属性存不存在都会去执行这个方法,所以在写这个方法的时候要小心循环调用。
这个方法只能在新式类中使用,不能在旧时类中使用。
'''
class Mother(object):
def __init__(self,name,address):
self.name = name
self.address = address
def __getattribute__(self, attr):
print('===拦截住===')
if attr != 'name':
raise AttributeError
mon = Mother('Ha','SZ')
# mon.job # 访问的属性不是name时,抛出异常。
'''
__call__:可调用的对象
只要在创建类型的时候定义了__call__()方法,这个类型就是可调用的。
'''
class Reader(object):
count = 0
def __init__(self,name,nationality):
self.name = name
self.nationality = nationality
Reader.count += 1
def __call__(self, *args, **kwargs):
print('Reader is :%s'%self.name)
print('nationality is %s:'%self.nationality)
print('%s is being %s.' % (self.name, *args))
print('The total number of readers is %s.' % Reader.count)
a = Reader('Tony','China')
a('Bom')
# a(company='tom')
b = Reader('iris','China')
b('Jack')
'''
会话管理
__enter__
__exit__(self,exc_type,exc_val,exc_tb)魔术方法
执行完这个with语句中的代码块或者是这个代码块中的代码发生了异常,就会执行这个方法。可以在这个方法中做一些清理工作。比如关闭文件等。
如果在with语句中发生了异常,那么exc_type和exc_val将会存储这个异常的信息,如果没有任何异常,那么他们的值为None。
如果在with语句中发生了异常,那么会执行__exit__方法,但是如果你不想让这个异常抛出with代码块,那么你可以返回True,就不会把异常抛出到外面了。
'''
class FilePath(object):
def __init__(self,*args,**kwargs):
self.args = args
self.kwargs = kwargs
def __enter__(self):
self.fp = open(*self.args,**self.kwargs)
return self.fp
def __exit__(self, exc_type, exc_val, exc_tb):
self.fp.close()
print(exc_type)
return False
with FilePath('./login.txt','r') as fp:
a = 1
b = 0
# c = a/b
print(fp.read())
import json
data = {
'name':'Teacher',
'age':None
}
loads_dict = json.dumps(data)
print(type(loads_dict))
print(json.loads(loads_dict))
Python基础之魔术方法(控制属性的访问和设置)的更多相关文章
- Python基础之魔术方法(一个序列容器的魔术方法)
# 创建自己想要的序列容器魔术方法'''__len__():调用len(obj)函数会调用这个魔术方法__getitem__(self,key):在使用下标操作temp['key']以及切片操作的时候 ...
- Python 类的魔术方法
Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...
- Python中的魔术方法详解
介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...
- Python中的魔术方法详解(双下方法)
介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...
- 解析python部分常用魔术方法
def __add__(self, *args, **kwargs): # real signature unknown """ Return self+value. & ...
- Python基础:新式类的属性访问
一.概述 二.准备工作 1.讨论对象 2.名词解释 三.实例绑定的属性访问 1.获取属性 一般规则 参考源码 示例验证 2.设置属性 一般规则 参考源码 示例验证 3.删除属性 一般规则 参考源码 示 ...
- Python学习笔记之面向对象编程(三)Python类的魔术方法
python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...
- python基础之魔法方法
由于hexo自带的markdown渲染引擎对双下划线做了转义,在正文中看到的魔法方法前后都没有双下划线 setattr.getattr.delattr 可以拦截对对象属性的访问 setattr函数是用 ...
- python所有的魔术方法
据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
随机推荐
- 3D点云完美匹配
3D点云完美匹配 The Perfect Match: 3D Point Cloud Matching with Smoothed Densities 地址链接: http://openaccess. ...
- 代码生成codegen
代码生成codegen 该模块提供了从SymPy表达式生成直接可编译代码的功能.该codegen功能是SymPy中代码生成功能的用户界面.下面为可能希望直接使用框架的高级用户提供了一些实现细节. 注意 ...
- 视频系列:RTX实时射线追踪(下)
视频系列:RTX实时射线追踪(下) Key things from part 4 光线有效载荷是从一个着色器传递到另一个着色器的结构. 这一切都发生在RTX的引擎下. 更小的有效载荷要好得多! 新的D ...
- 3,java数据结构和算法:约瑟夫环出队顺序, 单向环形链表的应用
什么是约瑟夫环? 就是数小孩游戏: 直接上代码: 要实现这个,只需要理清思路就好了 孩子节点: class Boy{ int no;//当前孩子的编码 Boy next; // 下一节点 public ...
- 保存数据到csv文件报错:Permission denied: './train_data.csv'
如果你此前已经输出,创建了文件,很有可能是你打开了此文件,导致写入不进去报错,关掉文件重新运行程序即可!
- 升级 macOS Big Sur 差点丢了我多年的珍藏文件(夹)!!!
原来升级 macOS Big Sur 过程中会转移根目录下的个人文件(夹). 春节期间升级了一下 macOS ,升级之前就比较担心丢数据,然而怕什么来什么.升级之后发现根目录下的个人文件(夹)都不见了 ...
- 选择合适Redis数据结构,减少80%的内存占用
redis作为目前最流行的nosql缓存数据库,凭借其优异的性能.丰富的数据结构已成为大部分场景下首选的缓存工具. 由于redis是一个纯内存的数据库,在存放大量数据时,内存的占用将会非常可观.那么在 ...
- oracle中如何处理null
从两个表达式返回一个非 null 值.语法NVL(eExpression1, eExpression2)参数eExpression1, eExpression2如果 eExpression1 的计算结 ...
- Vue.js的基础学习
Vue.js的基础网上很多,这里不记录 开始正式页面的开发 1.页面加载时请求数据 methods: { post() { //发送post请求 this.$http.post('../../ashx ...
- python3.6虚拟环境
3.1.安装python3.6 [root@slavenode1 ~]# python -V Python 2.7.5 [root@slavenode1 ~]# yum install python3 ...