zoukankan      html  css  js  c++  java
  • 反射

    1.isinstance(obj,cls)和issubclass(sub,super)

    isinstance(obj,cls)检查obj是否是cls的对象

    1 class Foo(object):
    2     pass
    3   
    4 obj = Foo()
    5   
    6 isinstance(obj, Foo)
    isinstance

    issubclass(sub,super)检查sub类是否是super类的派生类

    1 class Foo(object):
    2     pass
    3  
    4 class Bar(Foo):
    5     pass
    6  
    7 issubclass(Bar, Foo)
    issubclass

    2.什么是反射?

      程序可以访问,检测,修改自身状态或行为的一种能力

    3.Python面向对象中的反射:

      通过字符串的形式操作对象相关的属性.Python中的一切事物都是对象(都可以使用反射)

    四个可以实现自省的函数,hasattr,getattr,satattr,delattr!

     1 class BlackMedium:
     2     feature='Ugly'
     3     def __init__(self,name,addr):
     4         self.name=name
     5         self.addr=addr
     6 
     7     def sell_house(self):
     8         print('%s 黑中介卖房子啦,傻逼才买呢,但是谁能证明自己不傻逼' %self.name)
     9     def rent_house(self):
    10         print('%s 黑中介租房子啦,傻逼才租呢' %self.name)
    11 
    12 b1=BlackMedium('万成置地','回龙观天露园')
    13 
    14 #检测是否含有某属性
    15 print(hasattr(b1,'name'))
    16 print(hasattr(b1,'sell_house'))
    17 
    18 #获取属性
    19 n=getattr(b1,'name')
    20 print(n)
    21 func=getattr(b1,'rent_house')
    22 func()
    23 
    24 # getattr(b1,'aaaaaaaa') #报错
    25 print(getattr(b1,'aaaaaaaa','不存在啊'))
    26 
    27 #设置属性
    28 setattr(b1,'sb',True)
    29 setattr(b1,'show_name',lambda self:self.name+'sb')
    30 print(b1.__dict__)
    31 print(b1.show_name(b1))
    32 
    33 #删除属性
    34 delattr(b1,'addr')
    35 delattr(b1,'show_name')
    36 delattr(b1,'show_name111')#不存在,则报错
    37 
    38 print(b1.__dict__)
    39 
    4个自省函数的用法

    4.反射的好处:

      one.可以实现可插拔机制

        two.动态导入模块

    5.Python内置的attr:__setattr__,__delattr__,__getattr__

     1 class Foo:
     2     x=1
     3     def __init__(self,y):
     4         self.y=y
     5 
     6     def __getattr__(self, item):
     7         print('----> from getattr:你找的属性不存在')
     8 
     9 
    10     def __setattr__(self, key, value):
    11         print('----> from setattr')
    12         # self.key=value #这就无限递归了,你好好想想
    13         # self.__dict__[key]=value #应该使用它
    14 
    15     def __delattr__(self, item):
    16         print('----> from delattr')
    17         # del self.item #无限递归了
    18         self.__dict__.pop(item)
    19 
    20 #__setattr__添加/修改属性会触发它的执行
    21 f1=Foo(10)
    22 print(f1.__dict__) # 因为你重写了__setattr__,凡是赋值操作都会触发它的运行,你啥都没写,就是根本没赋值,除非你直接操作属性字典,否则永远无法赋值
    23 f1.z=3
    24 print(f1.__dict__)
    25 
    26 #__delattr__删除属性的时候会触发
    27 f1.__dict__['a']=3#我们可以直接修改属性字典,来完成添加/修改属性的操作
    28 del f1.a
    29 print(f1.__dict__)
    30 
    31 #__getattr__只有在使用点调用属性且属性不存在的时候才会触发
    32 f1.xxxxxx
    33 
    Python内置attr的用法
  • 相关阅读:
    hibernate怎么做分页
    JS+CSS带数字和左右按钮可控制切换的图片幻灯
    AOP下的权限控制实现
    Hibernate3和MyBatis(iBatis)的执行效率比较
    CKEditor/FCKEditor 使用-CKeditor 3.0.1 快速教程(含插入图片)
    用JS写CSS
    spring aop实现权限控制,路径控制
    sql server 同步复制要点
    千万别把自己当人才
    web.xml元素介绍
  • 原文地址:https://www.cnblogs.com/gz369521/p/6757858.html
Copyright © 2011-2022 走看看