反射

反射是通过'字符串'对 对象的属性进行操作,反射有四个内置的方法。

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【面向对象高级----反射、类的内置方法(魔法方法)、单例模式】的更多相关文章

  1. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  2. python面向对象的多态-类相关内置函数-类内置魔法函数-迭代器协议-上下文管理-04

    多态 一种事物具备不同的形态 例如:水 --> 固态.液态.气态 多态:# 多个不同对象可以相应同一个对象,产生不同的结果 首先强调,多态不是一种特殊的语法,而是一种状态,特性(多个不同对象可以 ...

  3. day28 面向对象:反射,内置函数,类的内置方法

    面向对象进阶博客地址链接: http://www.cnblogs.com/Eva-J/articles/7351812.html 复习昨日内容: # 包 # 开发规范 # # hashlib # 登录 ...

  4. python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

    主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数. hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回Tr ...

  5. python学习之老男孩python全栈第九期_day027知识点总结——反射、类的内置方法

    一. 反射 ''' # isinstance class A:pass class B(A):pass a = A() print(isinstance(a,A)) # 判断对象和类的关系 print ...

  6. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  7. python day21 ——面向对像-反射 getattr,内置方法

    一.反射:用字符串数据类型的变量名来访问这个变量的值 上代码^_^ # class Student: # ROLE = 'STUDENT' # @classmethod # def check_cou ...

  8. Python进阶-XVIV 类的内置方法:__str__ 、__repr__、析构函数(__del__)、双下的call,eq,new,hash 以及item相关的三个方法

    类的内置方法 它与内置函数有紧密的联系,有的内置函数就是调用的内置方法. 在顶级父类obj中有: 两个双下方法 obj.__str__ str(obj) obj.__repr__ repr(obj) ...

  9. python - 类的内置 attr 方法

    类的内置 attr 方法 #类的内置 attr 方法: # __getattr__ # __setattr__ # __delattr__ # __getattr__ #到调用一个类不存在数参数时,将 ...

随机推荐

  1. javafx实现读者文摘上的文章预览及下载

    功能设计: 1.实现读者文章的预览及下载 (实现了单击预览,双击下载) 2.实现文章查找 (实现了通过文章名查找(关键字)或者文章期数或年份(或者年份加期数)) 实现步骤: 首先是数据库设计: 数据库 ...

  2. VMware下Ubuntu全屏显示

      开始是这样的 完了之后应该是这样的 1.点开菜单栏的 虚拟机---------> 安装VMware Tools 安装完了之后桌面会出现一个这样的图标 双击这个DVD,进去之后左侧目录出现了 ...

  3. Java中有几种类型的流?

    (1)字节流 InputStream/OutputStream ①FileInputStream/FileOutputStream:文件字节流,用于文件的读写操作 ②BufferedInputStre ...

  4. Employment Planning

    Employment Planning 有n个月,每个月有一个最小需要的工人数量\(a_i\),雇佣一个工人的费用为\(h\),开除一个工人的费用为\(f\),薪水为\(s\),询问满足这n个月正常工 ...

  5. hdu 2774 后缀数组

    题目大意: 求两个字符串的最长公共子串 基本思路: 首先自然而然的想到应当把两个串拼接起来,为了便于处理,所以在串的中间加个大量(就是一个比其他值大的值),最后别忘了拼接上下标为n的时候是0,调用da ...

  6. vbs,修改文件名

    一次性能测试记录,因为项目要批量上传文件,奈何文件有50 * 2个,然后系统效验文件名,要不停地修改,找了一些资料整理脚本如下: strFolder = "\\xxxx\2018198_数据 ...

  7. Sublime Text添加gcc编译器

    { "shell_cmd" : "gcc $file_name -o ${file_base_name}", "working_dir" : ...

  8. php操作redis--集合(set)篇

    常用函数:sAdd,sMembers,sPop,sUnion等 应用场景:与list类型类似,是一个列表的功能,不同的是set可以自动排重,提供了一个判断某一个成员是否存在一个set集合内的重要接口. ...

  9. elementUI 日期时间选择器 只能选择当前及之后的时间

    日期时间选择器  只能选择当前及之后的时间 <el-date-picker class="input-border-null" prefix-icon="el-ic ...

  10. php手册的一些思考

    函数手册一定要认真看,很多用法都不太清楚:   array array_merge ( array $array1 [, array $... ] ) array_merge() 将一个或多个数组的单 ...