ホームページ  >  記事  >  バックエンド開発  >  Python の組み込み関数 getattr() の概要と例

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

WBOY
WBOYオリジナル
2016-06-16 08:43:051488ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。