zoukankan      html  css  js  c++  java
  • python的反射函数(hasattr()、getattr()、setattr()与delattr())和类的内置属性attr(__getattr()__、__setattr()__与__delattr()__)

    主要是指程序可以访问、检测和修改它本身状态或行为的一种能力(自省),有四个可以实现自省函数。

    hasattr(object,name) 判断object中是否有name字符串对应的属性或方法,返回True或False

    getattr(object,name[,defaultreturn])获取object中name字符串对应属性的值,没有这个属性的话会报错,defaultreturn表示如果没有对应的属性返回默认的设定值而不会报错

    setattr(object,key,value)表示修改object中key对应的属性的值为value,object中存在key属性则修改它的值,不存在则增加这个属性。

    delattr(object,key) 删除object中key对应的属性

    class cat:
        living='earth'
        def __init__(self,name,leg,tail):
            self.name = name
            self.leg = leg
            self.tail = tail
        def eat(self,food):
            print('%s likes to eat %s'%(self.name,food))
    cat1=cat('cat1',4,1)
    print(hasattr(cat1,'leg'),hasattr(cat1,'eat_food'))
    print(getattr(cat1,'tail'),getattr(cat,'eat_food','none searching attribute'))
    setattr(cat1,'leg',3)
    setattr(cat1,'func',lambda x:x+3)
    print(cat1.__dict__)
    delattr(cat1,'func')
    print(cat1.__dict__)
    
    # 输出如下:
    # True False
    # 1 none searching attribute
    # {'name': 'cat1', 'leg': 3, 'tail': 1, 'func': <function <lambda> at 0x0000029D0341A6A8>}
    # {'name': 'cat1', 'leg': 3, 'tail': 1}

    类的内置属性__getattr()__、__setattr()__与__delattr()__

    获取的属性不存在时,会触发类的内置__getattr()__方法(获取属性时,属性存在会触发__getattribute()__方法,不存在则__getattribute()__抛出AttributeError异常,并触发__getattr()__方法)

    给实例或者类增加或修改属性时、或者执行delattr(),会触发类的内置__setattr()__方法

    删除属性、或者执行delattr()时,会触发类的内置__delattr()__方法

    内置属性__getitem()__、__setitem()__与__delitem()__,意义与上面的attr类似

    不同之处在于,通过实例.属性时触发的是attr,通过实例[属性]时触发的是item

    isinstance(obj,cls) 判断obj是否是cls的对象,如果B是A的子类,C是B的实例,那么c也是A的对象

    issubclass(sub,super)判断sub是否是super的子类,如果B是A的子类,C是B的子类,那么C也是A的子类

  • 相关阅读:
    剑指offer63:数据流中的中位数
    剑指offer62:二叉搜索树的第k个结点,二叉搜索树【左边的元素小于根,右边的元素大于根】
    剑指offer61:序列化二叉树
    关于手机拍摄的图片在处理过程中出现问题的解决方法
    一道逻辑思考题
    鼠标右键无反应解决方法
    六大设计原则
    开源镜像网站
    获取当前文件夹下的文件名称
    wget使用方法
  • 原文地址:https://www.cnblogs.com/Forever77/p/10093605.html
Copyright © 2011-2022 走看看