1. 程式人生 > >Python3學習之路~7.3 反射

Python3學習之路~7.3 反射

err onclick 內存地址 urn 技術 pytho light src eight

python中的反射功能是由以下四個內置函數提供:hasattr、getattr、setattr、delattr,該四個函數分別用於對對象內部執行:檢查是否含有某成員、獲取成員、設置成員、刪除成員。

hasattr(obj,name_str):判斷一個對象obj裏是否有name_str字符串對應的的方法或者屬性
getattr(obj,name_str):相當於obj.name_str,根據字符串去獲取obj對象裏對應的方法的內存地址或對應屬性的值
setattr(x, ‘y‘, v) :相當於``x.y = v‘‘,即通過字符串設置新的屬性或方法
delattr(x, ‘y‘):相當於``del x.y‘‘,刪除對象obj裏y字符串對應的屬性

技術分享圖片
class Foo(object):
 
    def __init__(self):
        self.name = wupeiqi
 
    def func(self):
        return func
 
obj = Foo()
 
# #### 檢查是否含有成員 ####
hasattr(obj, name)
hasattr(obj, func)
 
# #### 獲取成員 ####
getattr(obj, name)
getattr(obj, func)
 
# #### 設置成員 ####
setattr(obj, age, 18) setattr(obj, show, lambda num: num + 1) # #### 刪除成員 #### delattr(obj, name) delattr(obj, func)
反射代碼示例1

反射代碼示例2:

#Author:Zheng Na

def bulk(self): #外部方法
    print("%s is yelling..." % self.name)

class Dog(object):
    def __init__(self,name,age):
        self.name = name
        self.age = age

    def eat(self):
        print("%s is eating..." %self.name)

d = Dog("小黃",1)
choice  = input("請輸入屬性或方法>>:").strip()

if choice == "name":
    # 判斷對象中是否有字符串對應的屬性
    print(hasattr(d,choice)) # true

    # 根據字符串去對象中獲取對應屬性的值
    attr = getattr(d,choice)
    print(attr) # 小黃

    # 修改對象中字符串對應屬性的值
    setattr(d,choice,"小白")
    print(d.name) # 小白

    # 刪除對象中字符串對應的屬性
    delattr(d,choice)
    print(d.name) # 報錯:AttributeError: ‘Dog‘ object has no attribute ‘name‘

elif choice == "eat":
    # 判斷對象中是否有字符串對應的方法
    print(hasattr(d, choice))  # true

    # 據字符串去獲取obj對象裏對應的方法的內存地址,然後調用這個方法
    func = getattr(d,choice)
    func() # 小黃 is eating...

    # 方法不能刪除?還是我的用法有錯?
    # delattr(d, choice) # 報錯:AttributeError: eat

elif choice == "talk":
    # 通過字符串設置新的方法,可動態地將一個外部的方法裝配到類裏
    # bulk現在相當於一個變量名,你現在用talk來代替了
    # 1.方法寫死
    # setattr(d,choice,bulk)
    # d.talk(d) # 小黃 is yelling...
    # 2.方法不寫死
    setattr(d,choice,bulk)
    func = getattr(d,choice)
    func(d) # 小黃 is yelling...

else:# choice輸入money
    # 通過字符串設置新的屬性
    setattr(d, choice, 22)
    print(getattr(d,choice)) # 22

3種方式獲取obj對象中的name變量指向內存中的值 “alex”

class Foo(object):

    def __init__(self):
        self.name = ‘alex‘

    def func(self):
        return ‘func‘

# 不允許使用 obj.name
obj = Foo()

print(obj.name)
print(getattr(obj, ‘name‘))
print(obj.__dict__[‘name‘])

  

  

Python3學習之路~7.3 反射