# 魔术方法--常规方法
# 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. NVIDIA Nsight Systems CUDA 跟踪

    NVIDIA Nsight Systems CUDA 跟踪 CUDA跟踪 NVIDIA Nsight Systems能够捕获有关在概要过程中执行CUDA的信息. 可以在报告的时间轴上收集和呈现以下信息 ...

  2. C++/VS基础篇

    ------------恢复内容开始------------ VS: 1.项目配置 2.IDE设置 错误列表是输出窗口的大概,根据error语法整理出,不准确. C++: 1.C++特点 优点 可直接 ...

  3. Python_selenium PO模式下 Tesecase 的相同执行代码做成selenium_base_case公共模块及调用

    作用: PO模式下 Tesecase 的相同执行代码做成selenium_base_case公共模块及调用,提高代码简洁度,实现同样效果. 框架结构: 代码简单实践: common模块下 seleni ...

  4. 5.7w字?GitHub标星120K的Java面试知识点总结,真就物超所值了

    如果你觉得在一些程序员平台获取到的资料太乱学习起来毫无头绪,但是单看<Java编程思想>相似的一类的Java圣经"枯燥无味",那我推荐你看一下这份GitHub获得过12 ...

  5. IDEA骚技巧

    1. var 声明 2. null 判空 3. notnull 判非空 4. nn 判非空 5. for 遍历 6. fori 带索引的遍历 7. not 取反 8. if 条件判断 9. cast ...

  6. 【SQLite】教程07-C/C++上使用SQLite3

    1.配置好C/C++项目环境 2.源码 1 #include <iostream> 2 #include <vector> 3 #include <string> ...

  7. kube-controller-manager源码分析-AD controller分析

    kubernetes ceph-csi分析目录导航 概述 kube-controller-manager组件中,有两个controller与存储相关,分别是PV controller与AD contr ...

  8. 乘风破浪,Java遇见OpenJDK GA(Build By Microsoft),即将晋升为Azure云管理服务默认JVM

    什么是Microsoft Build of OpenJDK Java Development Kit (JDK) 是Sun公司(已被Oracle收购)针对Java开发员的软件开发工具包.自从Java推 ...

  9. POJ 1654 Area 多边形面积 G++会WA

    #include<stdio.h> #include<algorithm> #include <cstring> using namespace std; type ...

  10. AcWing 1252. 搭配购买

    #include<bits/stdc++.h> #define N 10010 using namespace std; int fa[N],v[N],pr[N]; int vv[N],p ...