zoukankan      html  css  js  c++  java
  • 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__获得名称空间字典,对字典的存取操作。

  • 相关阅读:
    CSS中z-index的层级树概念
    随记
    PHP 随笔
    linux 相关
    Nginx 虚拟主机 VirtualHost 配置
    PHP 杂记
    Composer 资料
    PHP Yii架构学习
    java 日志技术汇总(log4j , Commons-logging,.....)
    Java 随笔
  • 原文地址:https://www.cnblogs.com/csic716/p/11951428.html
Copyright © 2011-2022 走看看