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...一起加油吧!(ง •̀_•́)ง
原文地址:https://www.cnblogs.com/smallfoot/p/10181920.html