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 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...
随机推荐
- NVIDIA Nsight Systems CUDA 跟踪
NVIDIA Nsight Systems CUDA 跟踪 CUDA跟踪 NVIDIA Nsight Systems能够捕获有关在概要过程中执行CUDA的信息. 可以在报告的时间轴上收集和呈现以下信息 ...
- C++/VS基础篇
------------恢复内容开始------------ VS: 1.项目配置 2.IDE设置 错误列表是输出窗口的大概,根据error语法整理出,不准确. C++: 1.C++特点 优点 可直接 ...
- Python_selenium PO模式下 Tesecase 的相同执行代码做成selenium_base_case公共模块及调用
作用: PO模式下 Tesecase 的相同执行代码做成selenium_base_case公共模块及调用,提高代码简洁度,实现同样效果. 框架结构: 代码简单实践: common模块下 seleni ...
- 5.7w字?GitHub标星120K的Java面试知识点总结,真就物超所值了
如果你觉得在一些程序员平台获取到的资料太乱学习起来毫无头绪,但是单看<Java编程思想>相似的一类的Java圣经"枯燥无味",那我推荐你看一下这份GitHub获得过12 ...
- IDEA骚技巧
1. var 声明 2. null 判空 3. notnull 判非空 4. nn 判非空 5. for 遍历 6. fori 带索引的遍历 7. not 取反 8. if 条件判断 9. cast ...
- 【SQLite】教程07-C/C++上使用SQLite3
1.配置好C/C++项目环境 2.源码 1 #include <iostream> 2 #include <vector> 3 #include <string> ...
- kube-controller-manager源码分析-AD controller分析
kubernetes ceph-csi分析目录导航 概述 kube-controller-manager组件中,有两个controller与存储相关,分别是PV controller与AD contr ...
- 乘风破浪,Java遇见OpenJDK GA(Build By Microsoft),即将晋升为Azure云管理服务默认JVM
什么是Microsoft Build of OpenJDK Java Development Kit (JDK) 是Sun公司(已被Oracle收购)针对Java开发员的软件开发工具包.自从Java推 ...
- POJ 1654 Area 多边形面积 G++会WA
#include<stdio.h> #include<algorithm> #include <cstring> using namespace std; type ...
- AcWing 1252. 搭配购买
#include<bits/stdc++.h> #define N 10010 using namespace std; int fa[N],v[N],pr[N]; int vv[N],p ...