初識python: 反射

 

反射:經過字符串映射或修改程序運行時的狀態、屬性、方法ide

反射有如下三個方法:spa

hasattr(object, name)           判斷一個對象(object)裏是否有對應的字符串(name)的屬性
getattr(object, name)            根據字符串(name)去獲取對象(object)裏的,對應方法的內存地址(即,獲取對應的方法)
setattr(object, name,value)   給對象(object)添加屬性(name)值(value)
delattr(object,name)             刪除對象的屬性code

實例:對象

def sleep(self):
    print('%s在睡覺' % self.name)

def talk():
    print('說話')

class People(object):
    sex = ''
    def __init__(self, name):
        self.name = name

    def eat(self):
        print('%s正在吃東西' % self.name)

p = People('simple')

print(hasattr(p, 'eat'))  # 返回True  # 判斷p這個對象中是否有eat這個屬性。
print(hasattr(p, 'name'))  # 返回True
f = getattr(p, 'eat')  # 獲取eat的內存地址,即,獲取eat方法
print(f)  # 打印eat的內存地址
print(f())  # 打印eat的返回值,即,執行eat方法


# 變量操做
str = input('變量:').strip()
val = input('變量的值:').strip()
if hasattr(p, str):  # 在p中是否存在str變量,str是用戶傳入的參數。若是存在,則執行如下操做。
    func = getattr(p, str)  # 獲取p中str變量
    print('原來的變量:%s=%s'%(str,func))
    setattr(p,func,val)  # 修改p中str變量的值
    f = getattr(p,func)  # 從新獲取p中str變量
    print('修改後的變量:%s=%s'%(str,val)) # 打印str的值
else:  # 在p中不存在str變量,執行如下操做。
    setattr(p,str,val)  # 給p添加變量str,並賦值val --> str = val
    gv = getattr(p,str)  # 獲取p中新添加的str變量
    print('新增了變量:%s=%s'%(str,gv))  # 打印新添加的str變量值
    delattr(p, str)  # 刪除變量
    print('刪除了變量:%s' % str)  # 刪除p中str變量
    print('是否還存在變量%s:%s'%(str,hasattr(p,str)))  # 刪除以後,再判斷屬性是否存在
變量操做

執行結果:blog

 

def sleep(self):
    print('%s在睡覺' % self.name)

def talk():
    print('說話')

class People(object):
    sex = ''
    def __init__(self, name):
        self.name = name

    def eat(self):
        print('%s正在吃東西' % self.name)

p = People('simple')

print(hasattr(p, 'eat'))  # 返回True  # 判斷p這個對象中是否有eat這個屬性。
print(hasattr(p, 'name'))  # 返回True
f = getattr(p, 'eat')  # 獲取eat的內存地址,即,獲取eat方法
print(f)  # 打印eat的內存地址
print(f())  # 打印eat的返回值,即,執行eat方法

# 方法操做
str = input('方法:').strip()
if hasattr(p, str):  # 在p中是否存在str方法,str是用戶傳入的參數。若是存在,則執行如下操做。
    func = getattr(p, str)  # 獲取p中str方法
    print('方法%s執行結果:'%(str),end='')
    func()  # 執行方法
else:  # 在p中不存在str方法,執行如下操做。
    # setattr(p,str,sleep)  # 給p添加了類方法sleep,帶self參數
    setattr(p,str,talk)  # 給p添加方法talk,不帶self參數

    # sleep = getattr(p,str)  # 獲取p中新添加的str方法的內存地址
    talk = getattr(p,str)

    print('新增了方法:%s,返回結果:'%str)  # 打印新添加的str變量值

    # sleep(p)  # 類方法調用,帶self
    talk() # 普通方法調用,不帶self

    delattr(p, str)  # 刪除方法
    print('刪除了方法:%s' % str)  # 刪除p中str變量
    print('是否還存在變量%s:%s'%(str,hasattr(p,str)))  # 刪除以後,再判斷屬性是否存在
方法操做

執行結果:ip

相關文章
相關標籤/搜索