Python對類實例使用getattr

在類的成員函數中,若是你想經過一個字符串(成員函數名)來調用類的成員函數,該怎麼作?函數

class A:
    val = 1
    def __init__(self):
        pass

    def fun_1(self):
        print self.val
        print "in fun_1"

    def fun_2(self):
        print "in fun_2"

對於上面的類,你能夠這樣用code

obj = A()
s = 'fun_1'
fn = getattr(obj, s)
fn()

可是若是你傳給getattr的第一個參數是對象名,那麼就要這樣用對象

obj = A()
s = 'fun_1'
fn = getattr(A, s)
fn(obj)

至關因而fn只是一個函數名,須要一個調用參數,第一個參數就是self,也就是對象實例。
在類成員函數中,能夠這樣用字符串

class A:
    val = 1
    def __init__(self):
        pass
    def control(self):
        name = 'fun_1'
        fn = getattr(A, name)
        fn(self)
    def fun_1(self):
        print self.val
        print "in fun_1"
    def fun_2(self):
        print "in fun_2"

看上面的成員函數control,也是同一個道理。
若是像下面這樣寫的話,會出錯get

def control(self):
    name = 'fun_1'
    fn = getattr(A, name)
    fn()

報錯信息就是
TypeError: unbound method fun_1() must be called with A instance as first argument (got nothing instead)
這個基本上指明瞭緣由。it

相關文章
相關標籤/搜索