Python の setattr()
関数は、オブジェクトの名前を指定してその属性を設定するために使用します。
非常に単純な関数ですが、Pythonのオブジェクト指向プログラミングの文脈では非常に有用であることがわかります。
この関数をPythonのプログラムでどのように使うことができるかを見てみましょう。
setattr()関数のシンタックス
オブジェクト名、属性名、値をパラメータとして受け取り、 object.attribute
を value
と等しくなるように設定します。
オブジェクトの属性はどのような型でもよいので、この関数によって例外が発生することはない。
フォーマット フォーマット: setattr(object, attr, value)
.
ここでは、setattr()
の使い方を示す簡単な例を示します。
class MyClass():
def __init__( self , name, value):
# Set the attribute of the class object
setattr ( self , name, value)
a = MyClass( 'KEY' , 100 )
print ( 'Printing attribute from Class Object:' , a.KEY)
print ( 'Printing attribute from getattr():' , getattr (a, 'KEY' ))
|
結果は以下の通りです。
Printing attribute from Class Object : 100
Printing attribute from getattr (): 100
|
setattr()は、オブジェクトの属性が事前にわからず、
object.attribute_name = value` で設定できない場合に非常に便利なメソッドです。
これは非常に便利なメソッドで、オブジェクトの属性が実行中に変更される可能性がある場合に使用され、オブジェクト指向プログラミングがこれらのシナリオでまだうまく機能することを示しています。
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
setattr() と getattrr() を併用する場合
setattr() は getattr()
メソッドと一緒に使うのが一般的で、オブジェクトの属性を取得したり設定したりすることができます。
ここでは、 getattr()
メソッドと組み合わせた場合の setattr()
の使用例について説明します。
この例では、一人の生徒に対して、オブジェクトを構築し、各科目の属性を対応するマークに設定します。
setattr()を使用して Student オブジェクトを作成した後、
getattr()` を使用して生徒の科目ごとの点数をソートします。
class Student():
def __init__( self , name, results):
self .name = name
for key, value in results.items():
# Sets the attribute of the 'subject' to
# the corresponding subject mark.
# For example: a.'Chemistry' = 75
setattr ( self , key, value)
def update_mark( self , subject, mark):
self .subject = mark
subjects = [ 'Physics' , 'Chemistry' , 'Biology' ]
a = Student( 'Amit' , {key: value for (key, value) in zip (subjects, [ 73 , 81 , 90 ])})
b = Student( 'Rahul' , {key: value for (key, value) in zip (subjects, [ 91 , 89 , 74 ])})
c = Student( 'Sunil' , {key: value for (key, value) in zip (subjects, [ 59 , 96 , 76 ])})
student_list = [a, b, c]
stud_names = [student.name for student in student_list]
print ( 'Sorted Physics Marks:' )
print ( sorted ([ getattr (s, 'Physics' ) for s in student_list]))
print ( ' )
print ( sorted ([ getattr (s, subject) for s in student_list for subject in subjects]))
print ( ' )
print ( dict ( zip (stud_names, [ sorted ([ getattr (s, subject) for subject in subjects]) for s in student_list])))
|
Pythonのワンライナーの中には非常に複雑に見えるものもありますが、そうではありません。
最初の sorted([getattr(s, 'Physics') for s in student_list])
は、次のものと同じ意味です。
ls = []
for s in student_list:
ls.append( getattr (s, 'Physics' ))
# Sort the list ls.sort() print (ls)
|
2番目のライナーも非常によく似ていますが、1つのループの代わりに2つのネストされたループを使用しています。
ls = []
for s in student_list:
for subject in subjects:
ls.append( getattr (s, subject))
ls.sort() print (ls)
|
最後のものは少し厄介で、各生徒について name: sorted_subject_marks
の Dictionary を作成します。
まず、各名前を繰り返し処理し、生徒オブジェクトリストから属性を取得し、中間リストをソートしてから辞書に追加します。
dct = {}
for name, s in zip (subjects, student_list):
ls = []
for subject in subjects:
ls.append( getattr (s, subject))
ls.sort()
dct[name] = ls
print (dct)
|
コードスニペットの出力
Sorted Physics Marks:
[ 59 , 73 , 91 ]
Sorted Marks for all subjects:
[ 59 , 73 , 74 , 76 , 81 , 89 , 90 , 91 , 96 ]
Sorted Marks for every Student:
{ 'Amit' : [ 73 , 81 , 90 ], 'Rahul' : [ 74 , 89 , 91 ], 'Sunil' : [ 59 , 76 , 96 ]}
|
まとめ
この記事では、オブジェクトの属性を実行時に動的に設定するための setattr()
メソッドについて学びました。
このメソッドはオブジェクト指向プログラミングにおいて、開発者が属性を知らない場合に非常に有用なメソッドであり、柔軟なAPIを構築するために使用されます。