1. 程式人生 > >Python類(四)-反射

Python類(四)-反射

調用 創建 utf post __init__ 布爾型 img 返回 info

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

有4個方法:

hasattr():

hasattr(object,string):object為實例化的對象,string為字符串

判斷對象object裏是否有對應字符串string的方法或屬性,返回布爾型

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

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

if __name__ == ‘__main__‘:
    p = Person(‘John‘) #實例化Person類
    argu = input(">>>:").strip()
    print(hasattr(p,argu))

運行,輸入name

類中有name這個屬性,返回True

技術分享圖片

輸入eat

類中有eat這個方法,返回True

技術分享圖片

輸入test

類中沒有test這個屬性和方法,返回False

技術分享圖片

getattr():

getattr(object,string[,default]):object為實例化的對象,string為字符串,default為默認值

根據字符串string來獲取對象object中的方法或屬性,如果對象object中沒有字符串string的屬性或方法,就會返回default的值,如果不設置default的值,將會報錯

獲取類中方法並調用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    if hasattr(p,argu):
        getattr(p,argu)(‘meat‘)

執行結果

技術分享圖片

獲取類中屬性的值

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    print(getattr(p,argu))

技術分享圖片

如果字符串不是類中的屬性,則返回規定的默認值

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    print(getattr(p,argu,"test"))

輸入a,類中沒有a這個屬性,則返回規定的默認值test

技術分享圖片

setattr():

setattr(object,string,value):object為實例化的對象,string為字符串,value為值

setattr()用來設置方法或屬性

把傳入的字符串string設置為value名的函數,再通過getattr()來調用

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

#在類外定義一個函數
def talk(self):
    print("%s is talking"%self.name)

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    setattr(p,argu,talk) #把傳入的字符串設置為talk函數
    getattr(p,argu)(p) #把實例化的對象傳入函數中

運行,輸入a

技術分享圖片

調用的不是talk()函數,而是設置為talk()函數的字符串a

setattr()設置屬性

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    setattr(p,argu,‘Man‘) #設置屬性
    print(getattr(p,argu))

傳入的字符串string,如果不是類中的屬性,將給類創建新屬性string,並賦值value給新屬性

技術分享圖片

傳入的字符串string,如果是類中的屬性,value將覆蓋原有的屬性

技術分享圖片

delattr():

delattr(object,string):刪除object對象中的string屬性

# -*- coding:utf-8 -*-
__author__ = "MuT6 Sch01aR"

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

    def eat(self,food):
        print(‘%s is eating %s‘%(self.name,food))

if __name__ == ‘__main__‘:
    p = Person(‘John‘)
    argu = input(">>>:").strip()
    delattr(p,argu)
    print(getattr(p,argu))

運行,輸入name

技術分享圖片

報錯,Person類中沒有了name屬性

Python類(四)-反射