# 魔术方法--常规方法
# 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基础之魔术方法(控制属性的访问和设置)的更多相关文章

  1. Python基础之魔术方法(一个序列容器的魔术方法)

    # 创建自己想要的序列容器魔术方法'''__len__():调用len(obj)函数会调用这个魔术方法__getitem__(self,key):在使用下标操作temp['key']以及切片操作的时候 ...

  2. Python 类的魔术方法

    Python中类的魔术方法 在Python中以两个下划线开头的方法,__init__.__str__.__doc__.__new__等,被称为"魔术方法"(Magic method ...

  3. Python中的魔术方法详解

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  4. Python中的魔术方法详解(双下方法)

    介绍 在Python中,所有以“__”双下划线包起来的方法,都统称为“Magic Method”,中文称『魔术方法』,例如类的初始化方法 __init__ ,Python中所有的魔术方法均在官方文档中 ...

  5. 解析python部分常用魔术方法

    def __add__(self, *args, **kwargs): # real signature unknown """ Return self+value. & ...

  6. Python基础:新式类的属性访问

    一.概述 二.准备工作 1.讨论对象 2.名词解释 三.实例绑定的属性访问 1.获取属性 一般规则 参考源码 示例验证 2.设置属性 一般规则 参考源码 示例验证 3.删除属性 一般规则 参考源码 示 ...

  7. Python学习笔记之面向对象编程(三)Python类的魔术方法

    python类中有一些方法前后都有两个下划线,这类函数统称为魔术方法.这些方法有特殊的用途,有的不需要我们自己定义,有的则通过一些简单的定义可以实现比较神奇的功能 我主要把它们分为三个部分,下文也是分 ...

  8. python基础之魔法方法

    由于hexo自带的markdown渲染引擎对双下划线做了转义,在正文中看到的魔法方法前后都没有双下划线 setattr.getattr.delattr 可以拦截对对象属性的访问 setattr函数是用 ...

  9. python所有的魔术方法

    据说,Python 的对象天生拥有一些神奇的方法,它们总被双下划线所包围,他们是面向对象的 Python 的一切. 他们是可以给你的类增加魔力的特殊方法,如果你的对象实现(重载)了这些方法中的某一个, ...

随机推荐

  1. Pytorch和CNN图像分类

    Pytorch和CNN图像分类 PyTorch是一个基于Torch的Python开源机器学习库,用于自然语言处理等应用程序.它主要由Facebookd的人工智能小组开发,不仅能够 实现强大的GPU加速 ...

  2. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...

  3. Spring Cloud系列(三):服务消费与负载均衡

    上一篇介绍了服务提供者,有了注册中心和服务提供者,我们就可以进行服务消费了.Spring Cloud可以通过RestTemplate+Ribbon和Feign这两种方式消费服务. 我们仍然在上一篇的项 ...

  4. Linux芯片驱动之SPI Controller

    针对一款新的芯片,芯片厂商如何基于Linux编写对应的 SPI controller 驱动? 我们先看看 Linux SPI 的整体框架: 可以看到,最底层是硬件层,对应芯片内部 SPI contro ...

  5. 【NX二次开发】镜像对象

    使用uf5946获取镜像矩阵注意:uf5946镜像这个函数,只能用#define UF_plane_type=46这种类型的数据作为镜像面,不能用#define UF_datum_plane_type ...

  6. 不懂就问」CPU 到底是怎么识别代码的?

    近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU对代码的识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们. 首先要开始这个话题要先说一下半导体.啥叫半导体? 半导体其实就 ...

  7. 【模拟8.01】big(trie树)

    一道trie树的好题 首先我们发现后手对x的操作就是将x左移一位,溢出位在末尾补全 那么我们也可以理解为现将初值进行该操作,再将前i个元素异或和进行操作,与上等同. 那么我们等于转化了问题:     ...

  8. js-动态表单校验-吐血总结最近遇到的变态表单校验2---element+原生

    上一部分总结了基础常用的js表单校验,包括原生以及框架,下面来总结这一个月涉及到的动态校验: 动态表单校验大致分为三种情况: 1. 首先是固定校验规则,但是表单组件是动态生成的,例如:在表单或者表格里 ...

  9. vs2008中安装dev之后输入代码会输入代码段但是报错,可能解决方法

    vs2008工具栏DevExpress→Options 取消勾选这个

  10. react中 props,state,render函数的关系

    1.当组件的 state 或者 props 发生改变的时候,自己的render函数就会重新执行. 2. 当父组件的render函数执行时,其所有子组件的render函数都会重新执行.