物件導向 -- 反射

想吃橙子發表於2019-03-30

什麼是反射

反射主要指程式可以訪問,檢測和修改它本身狀態或行為的一種能力(自省)。

物件導向的反射

getarre

getarre() ,一個內建函式

作用是通過字串型別的屬性名,得到真正的這個字串的名字對應的物件的屬性值

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__)

 

相關文章