Python の公式ドキュメントでは、getattr() は次のように説明されています。
getattr(object, name[, default]) Return the value of the named attribute of object. name must be a string. If the string is the name of one of the object's attributes, the result is the value of that attribute. For example, getattr(x, 'foobar') is equivalent to x.foobar. If the named attribute does not exist, default is returned if provided, otherwise AttributeError is raised.
属性名に基づいてオブジェクトの値を返します。 「name」がオブジェクト プロパティの名前である場合、対応するプロパティの値が返されます。
'# -*- coding: utf-8 -*-' __author__ = 'lucas' class attrtest(object): def __init__(self): pass def trygetattr0(self): self.name = 'lucas' print self.name #equals to self.name print getattr(self,'name') def attribute1(self,para1): print 'attribute1 called and '+ para1+' is passed in as a parameter' def trygetattr(self): fun = getattr(self,'attribute1') print type(fun) fun('crown') if __name__=='__main__': test = attrtest() print 'getattr(self,\'name\') equals to self.name ' test.trygetattr0() print 'attribute1 is indirectly called by fun()' test.trygetattr() print 'attrribute1 is directly called' test.attribute1('tomato')
このコードを実行した結果は次のようになります:
getattr(self,'name') equals to self.name lucas lucas attribute1 is indirectly called by fun() <type 'instancemethod'> attribute1 called and crown is passed in as a parameter attrribute1 is directly called attribute1 called and tomato is passed in as a parameter Process finished with exit code 0
最初の関数 tryattribute0() は、定義に記載されているとおり、非常に理解しやすいです。 2 番目の関数 tryattribute1() は少しわかりにくいです。実際、原理は複雑ではありません。fun のタイプはインスタンスメソッドであることがわかります。関数の場合、getattr() の戻り値はポインタであり、そのポインタはそれを受け取る変数に割り当てられます。将来、この変数を呼び出すことは、関数を指す変数を呼び出すことと同じになります。
原理はわかりましたが、getattr の機能は何でしょうか?
Java または C# のリフレクションについてご存知ですか?リフレクションの重要な役割は、読み込みを遅らせることです。これにより、システムが分離され、より効率的に実行されるようになります。動的言語として、Python は明らかにこの点でより強力です。
getattr() は、Python リフレクションを実装するためのビルディング ブロックであり、setattr()、dir() などの他のメソッドと組み合わせると、多くの興味深いことができます。
次のシーンを見てみましょう:
1. 他のクラスのメソッドをクラスに動的に追加する必要があります。
#如果类A中有如下方法: def addnewattributesfromotherclass(self,class_name): func_names = dir(class_name) for func_name in func_names: if not func_name.startswith('_'): new_func = getattr(class_name,func_name) self.__setattr__(func_name,new_func())
必要なのは次のとおりです:
a = A() b = B() a.addnewattributesfromotherclass(b)
このようにして、A は B の「非プライベート」メソッドを呼び出すことができます。