pythonでのhasattr()、getattr()、setattr()関数の使用

3736 ワード

引用:
上級者が書いたコードを読むとき、簡単な形式がたくさんありますが、見たことがなければ本当に意味がよくわかりません.その中の1つはgetattr()がクラスの変数や方法を呼び出すためによく使われています.関連するhasattr()、getattr()、setattr()関数の使用も一緒に勉強しました.
本文:
  1. hasattr(object, name)
objectオブジェクトにname属性が存在するかどうかを判断し、もちろんpythonのオブジェクトにとって、属性には変数と方法が含まれている.ある場合はTrue、ない場合はFalseを返します.nameパラメータはstringタイプであるため、変数を判断するにしてもメソッドを判断するにしても、その名前は文字列形式で参照される.getattrとsetattrも同じです.
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'A()    func()'

    
>>> 
>>> hasattr(A, 'name')
True
>>> 
>>> hasattr(A, 'age')
False
>>> 
>>> hasattr(A, 'func')
True
>>> 

2. getattr(object, name[, default])
objectオブジェクトの属性の値を取得し、存在する場合は属性値を返し、存在しない場合はdefaultパラメータがない場合、直接エラーを報告します.defaultパラメータが与えられ、オブジェクト自体にname属性がない場合、与えられたdefault値が返されます.与えられた属性nameがオブジェクトのメソッドである場合、関数オブジェクトが返され、関数オブジェクトを呼び出して関数の戻り値を得る必要があります.呼び出すと、funcがfunc()のように関数オブジェクトの後ろに括弧を付ける.
また、与えられたメソッドfunc()がインスタンス関数であればgetattr(A,'func')()を書くことはできない.fun()がインスタンス関数であれば、Aクラスオブジェクトで呼び出すことはできないので、getattr(A()、'func')()と書くべきである.インスタンス関数とクラス関数の違いは簡単に理解できますが、インスタンス関数定義時に直接def func(self):このように定義された関数はクラスをインスタンス化した後、クラスのインスタンス化オブジェクトで呼び出すしかありません.クラス関数の定義には@classmethodで装飾する必要があります.関数のデフォルトのパラメータは一般的にclsで、クラス関数はクラスオブジェクトで直接呼び出すことができ、クラスをインスタンス化する必要はありません.
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'
    
>>> 
>>> getattr(A, 'name')
'python'
>>> 
>>> getattr(A, 'age')    # age        

Traceback (most recent call last):
  File "", line 1, in 
    getattr(A, 'age')
AttributeError: class A has no attribute 'age'
>>> 
>>> getattr(A, 'age', 20)
20
>>> 
>>> getattr(A, 'func')

>>> 
>>> getattr(A, 'func')()    # func()     A     ,    

Traceback (most recent call last):
  File "", line 1, in 
    getattr(A, 'func')()
TypeError: unbound method func() must be called with A instance as first argument (got nothing instead)
>>> 
>>> getattr(A(), 'func')()
'Hello world'
>>> 
>>> class A(object):
    name = 'python'
    @classmethod
    def func(cls):
      return 'the method of A object.'
>>> 
>>> getattr(A, 'func')()
'the method of A object.'
>>>

3. setattr(object, name, value)
オブジェクトオブジェクトのname属性にvalueを割り当て、オブジェクトに所定の属性nameが存在する場合、setattrは属性の値を所定のvalueに変更します.オブジェクトにもともと属性nameが存在しない場合、setattrはオブジェクトに属性を作成し、指定したvalueに値を割り当てます.
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> setattr(A, 'name', 'java')
>>> getattr(A, 'name')
'java'
>>> 
>>> setattr(A, 'age', 20)
>>> getattr(A, 'age')
20
>>> 

一般に、オブジェクトに属性があるかどうかを判断し、存在する場合は返す.存在しない場合は、オブジェクトに属性を追加し、値を割り当てます.簡単なif-else判断:
>>> 
>>> class A():
    name = 'python'
    def func(self):
        return 'Hello world'

    
>>> 
>>> if hasattr(A, 'age'):
    print getattr(A, 'age')
else:
    setattr(A, 'age', 20)

    
>>> 
>>> getattr(A, 'age')
20
>>>