Python の組み込み関数 getattr() の概要と例

WBOY
リリース: 2016-06-16 08:43:05
オリジナル
1489 人が閲覧しました

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 の「非プライベート」メソッドを呼び出すことができます。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート