• 面向对象 -- 反射


    什么是反射

    反射主要指程序可以访问,检测和修改它本身状态或行为的一种能力(自省)。

    面向对象的反射

    getarre

    getarre() ,一个内置函数

    作用是通过字符串类型的属性名,得到真正的这个字符串的名字对应的对象的属性值

    所有的 a.b 都可以变成 getattr(a,'b')

    用字符串数据类型的变量名,来获取实际的变量值(找到这个变量对应的内存地址)

    class Student:
        def __init__(self,name):
            self.name = name
    wu = Student('')
    ret = getattr(wu,'name')
    此时 ret 就相当于 wu.name

    hasattr

    hasattr(),一个内置函数

    if hasattr(a,b)   判断b是不是对象a里面的属性

    class Student:
        def __init__(self,name):
            self.name = name
    wu = Student('')
    name = input('>>>')
    if hasattr(wu,name): 判断输入的内容是否是wu这个对象里的属性或方法
        ret = getattr(wu,name)

    callable

    callable(a)   一个内置函数,作用是判断a是否可以被调用

    实例应用

    class Jay:
        def __init__(self,name):
            self.name = name
    
        def sweet(self):
            print('告白气球')
    
        def warm(self):
            print('不能说的秘密')
    
        def real(self):
            print('稻香')
    
        def guitar(self):
            print('晴天')
    
        def nice(self):
            print('七里香')
    j = Jay('周杰伦')
    while 1:
        song = input('>>>')
        if hasattr(j,song):
            nb = getattr(j,song)
            if callable(nb):
                nb()
            else:
                print(nb)
        else:
            print('输入错误,请重新输入')
    class Foo:
        f = '类的静态变量'
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
        def say_hi(self):
            print('hi,%s'%self.name)
    
    obj=Foo('egon',73)
    
    #检测是否含有某属性
    print(hasattr(obj,'name'))
    print(hasattr(obj,'say_hi'))
    
    #获取属性
    n=getattr(obj,'name')
    print(n)
    func=getattr(obj,'say_hi')
    func()
    
    print(getattr(obj,'aaaaaaaa','不存在啊')) #报错
    
    #设置属性
    setattr(obj,'sb',True)
    setattr(obj,'show_name',lambda self:self.name+'sb')
    print(obj.__dict__)
    print(obj.show_name(obj))
    
    #删除属性
    delattr(obj,'age')
    delattr(obj,'show_name')
    delattr(obj,'show_name111')#不存在,则报错
    
    print(obj.__dict__)
  • 相关阅读:
    Access, SQL Server, and Oracle数据类型的对应关系
    [转]SQL Server 2005 从差异备份还原数据库
    疲惫
    关于在cmd命令里的路径包含空格的问题
    导Excel时的科学计数法问题
    [转]SQL SERVER 2005 备份与恢复简介
    [转]用C#创建Windows Service
    [转] vb.net option
    [转]sql server profiler only TrueType fonts are supported. this is not a truetype font
    进程、线程、协程之概念理解[转帖]
  • 原文地址:https://www.cnblogs.com/biulo/p/10627492.html
Copyright © 2020-2023  润新知