CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】
反射
反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法。
hasattr 通过字符串 判断对象的属性或者方法是否存在
getattr 通过字符串 获取对象的属性或者方法 getattr ( ref , 'z' , '没有值') 可以设置返回值,防止报错
setattr 通过字符串 设置对象的属性或者方法
delattr 通过字符串 删除对象的属性或者方法
# _*_ coding: gbk _*_
# @Author: Wonder class Reflection:
def __init__(self, x, y):
self.m = x
self.n = y ref = Reflection(1, 2)
print(hasattr(ref, 'm')) # True print(getattr(ref, 'n')) # 2 print(getattr(ref, 'z')) # AttributeError: 'Reflection' object has no attribute 'z'
print(getattr(ref, 'z', '没有值')) # 没有值 setattr(ref, 'a', [1, 2, 3])
print(getattr(ref, 'a')) # [1, 2, 3] delattr(ref, 'n')
print(getattr(ref, 'n', '么得')) # 么得
-----------------------------------------2019----11----29-----------------------------------------
类的内置方法(魔法方法)
凡是在类内部定义,以__开头,__结尾的方法,都是类的内置方法,也称为魔法方法。
类的内置方法会在满足某种条件下自动触发。
1、__new__ 和 __init__ 组合使用,完成类的实例化
__new__(cls,*args,**kwargs) 实例化对象的第一步就是先执行__new__,将类cls传进__new__,然后,必须要return一个对象,可以直接调用object.__new__生成。
__init__(self) 实例化对象的第二步,__init__收到第一步 __new__的返回值(一个对象),将其传给self。完成初始化后续操作,不需要返回值。
2、__call__ 调用 对象( ) 时触发
之前只有碰到过 类+( ) ,在进行 对象+( ) 操作时,会触发__call__,返回该方法的返回值。
在学到元类的时候,会知道 类本身也是对象,调用类生成对象(实例化)的时候也会执行__call__。
3、__getattr__ 和 __getattribute__
__getattr__ (self,item) 在对象.属性时,且属性不存在的时候触发。 在重写该方法时,在方法体内不允许再次使用【对象.不存在的属性】,否则会死循环到最大递归深度,报错。
__getattribute__(self ,item) 在对象.属性时,无论属性是否存在,都会触发此方法。 在重写该方法时,在方法体内不允许使用【对象.属性】的操作,否则会死循环到最大递归深度,报错。
前面学的 反射中 getattr( )方法的本质也是使用了该内置方法。
4、__setattr__
__setattr__(self,key,value) 当给对象的属性赋值 对象.属性 = 值 时触发。在重写该方法时,在方法体内不允许再次使用 【对象.属性 = 值】,否则会死循环到最大递归深度,报错。如果要赋值,可以通过self.__dict__[key] = value 的方式进行赋值。
5、__str__
在打印时触发该方法,重写该方法时,务必要返回一个字符串
6、__getitem__ 和 __setitem__
__getitem__ ( self ,item )在使用 self [ item] 取值的时候,触发该方法。
__setitem__( self ,item,value )在使用 self [ item ] = value 赋值的时候,触发该方法。
以上两种通过中括号取值的方式,本质上是在底层通过self.__dict__获得名称空间字典,对字典的存取操作。
CSIC_716_20191129【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】的更多相关文章
- python基础(14)-反射&类的内置函数
反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...
- python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04
多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...
- day28 面向对象:反射,内置函数,类的内置方法
面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...
- python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)
主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...
- python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法
一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- python day21 ——面向对像-反射 getattr,内置方法
一.反射:用字符串数据类型的变量名来访问这个变量的值 上代码^_^ # class Student: # ROLE = 'STUDENT' # @classmethod # def check_cou ...
- Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法
类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...
- python - 类的内置 attr 方法
类的内置 attr 方法 #类的内置 attr 方法: # __getattr__ # __setattr__ # __delattr__ # __getattr__ #到调用一个类不存在数参数时,将 ...
随机推荐
- 【Luogu】【关卡2-14】 树形数据结构(2017年10月)【AK】
任务说明:由一个根节点分叉,越分越多,就成了树.树可以表示数据之间的从属关系 P1087 FBI树 给一个01字符串,0对应B,1对应I,F对应既有0子节点又有1子节点的根节点,输出这棵树的后序遍历. ...
- React 使用antd 清空表单
handleResetClick = e => { this.props.form.resetFields();};
- Sql 语法整理
Query 1 SELECT 和 SELECT * 语句 SELECT LastName,FirstName FROM Persons 2 SELECT DISTINCT 语句 SELECT DIST ...
- leetcode-12双周赛-1246-删除回文子数组
题目描述: 方法:区间dp O(N^3) class Solution: def minimumMoves(self, A: List[int]) -> int: N = len(A) dp = ...
- 半途而废的Java爬虫学习经历
最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记 Java网络爬虫 简单介绍 爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获 ...
- PHP ftp_pwd() 函数
定义和用法 ftp_pwd() 函数返回指定 FTP 连接的当前目录名称. 语法 ftp_pwd(ftp_connection) 参数 描述 ftp_connection 必需.规定要使用的 FTP ...
- 【Flutter学习】基本组件之基本按钮组件
一,概述 由于Flutter是跨平台的,所以有适用于Android和iOS的两种风格的组件.一套是Google极力推崇的Material,一套是iOS的Cupertino风格的组件.无论哪种风格,都是 ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- 14、java实现poi操作excel,包括读和写日期格式,并且设置字体样式
1.首先大家来看导出的结果 下边就是导出的代码了 protected void testExcel() throws IOException{ String path=getServletContex ...
- 修改 Chrome浏览器主页被劫持 chrome 主页被篡改成hao.qquu8.com的解决方案
1. 开始菜单输入‘g'找到 Google Chrome浏览器 2. 修改属性->目标,将 chrome.exe hao.qquu8.com 后面的网址去掉,如图: