zoukankan      html  css  js  c++  java
  • python学习日记(OOP——反射)

    反射

    反射就是通过字符串的形式,导入模块;通过字符串的形式,去模块寻找指定函数,并执行。利用字符串的形式去对象(模块)中操作(查找/获取/删除/添加)成员,一种基于字符串的事件驱动!

    hasattr

    判断对象中是否有这个方法或变量

    class Person(object):
        def __init__(self,name):
            self.name = name
        def walk(self):
            print('{} is walking'.format(self.name))
    
    li = Person('libai')
    print(hasattr(li,'name'))#True。因为存在name变量
    print(hasattr(li,'walk'))#True。因为存在walk方法
    print(hasattr(li,'age'))#False。因为不存在age方法或变量

    getattr

    获取对象中的方法或变量的内存地址

    class Person(object):
        def __init__(self,name):
            self.name = name
        def walk(self):
            print('{} is walking'.format(self.name))
    
    li = Person('libai')
    
    n = getattr(li,'name')#获取name变量的内存地址
    print(n)
    
    f = getattr(li,'walk')#获取walk方法的内存地址
    f()                   #调用walk方法
    
    #我们发现getattr有三个参数,那么第三个参数是做什么的呢?
    s = getattr(li,'age','not found')
    print(s)    # 打印结果:not find。因为age在对象s中找不到,本应该报错,属性找不到,但因为修改了找不到就输出not find

    hasattr、getattr练习

    # 通过反射
    # 对象名 获取对象属性 和 普通方法
    # 类名 获取静态属性 和类方法 和 静态方法

    参考源码:hasattr_getattr.py

    setattr

    为对象添加变量或方法

    def func(self):
        print('{} is walking'.format(self.name))
    
    class Person(object):
        def __init__(self,name):
            self.name = name
    
    li = Person('libai')
    setattr(li,'walk',func)#将func函数添加到对象li中,并命名为walk
    li.walk(li)            #调用walk方法,因为这是额外添加的方法,需要手动传入对象
    
    setattr(li,'age',28)    #添加一个变量age
    print(li.age)           #打印结果

    delattr

    删除对象中的变量。注意:不能用于删除方法

    class Person(object):
        def __init__(self,name):
            self.name = name
        def walk(self):
            print('{} is walking'.format(self.name))
    
    li = Person('libai')
    
    delattr(li,'name')  #删除name 变量
    print(li.name)      #引发异常

     反射当前模块成员

    name = 'kk'
    import sys
    # print(sys.modules)
    # print(getattr(sys.modules['__main__'],'name'))
    print(getattr(sys.modules[__name__],'name'))#获取当前模块的属性
    import time
    t = input('>>>')
    
    #不带参数,测试输入:asctime
    # ti = getattr(time,t)
    # print(ti())
    
    #带参数的处理,测试输入:strftime
    ti = getattr(time,t)('%Y-%m-%d %H:%M:%S')
    print(ti)
    作者:Gruffalo
    ---------------------------------------------
    天行健,君子以自强不息
    地势坤,君子以厚德载物
    内容仅为自己做日常记录,备忘笔记等
    真小白,努力学习ing...一起加油吧!(ง •̀_•́)ง
  • 相关阅读:
    数据库表设计--备份记录的表设计优化
    WINDOWS CLUSTER -- 时间不同步导致的群集问题
    SQL Server--存在则更新问题
    MySQL--Ansible推送密钥实现免密码登录
    我命由我不由天
    hive中同源多重insert写法
    单文件数据库
    NTP时钟同步配置
    SQL中左连接on and条件和where条件执行先后顺序
    maven引入CDH依赖包
  • 原文地址:https://www.cnblogs.com/smallfoot/p/10181920.html
Copyright © 2011-2022 走看看