Pythonでも、C#等によく似たプロパティを扱えます。
C#を例として見ていきます。
例:C#のプロパティ
Exam.cs
public class Exam {
private int _mathGrade;
public int MathGrade {
get { return _mathGrade; }
set {
if (value < 0 || 100 < value) {
throw new ArgumentOutOfRangeException("Grade must be between 0 and 100");
}
_mathGrade = value;
}
}
}
Pythonのプロパティ
Exam.py
class Exam(object):
"""試験結果"""
def __init__(self):
"""コンストラクタ"""
self._math_grade = 0
@property
def math_grade(self):
"""数学"""
return self._math_grade
@math_grade.setter
def math_grade(self, value):
if not (0 <= value <= 100):
raise ValueError("Grade must be between 0 and 100")
self._math_grade = value
# 以下省略
一見、math_grade
という関数が二つあるように見えます。
しかし、プロパティのgetterに相当する処理に@property
アノテーション、setterに相当する処理に@[プロパティ名].setter
アノテーションを付与すると、それらを一体として、プロパティとして扱ってくれます。
上記のソースだと、math_grade
というプロパティが、Exam
クラスにある状態になります。
使い方
C#とほとんど同じです。
Main.py
exam = Exam()
exam.math_grade = 60
print(exam.math_grade) # 60と出力
クラス辞書を出力
Exam.__dict__
で、Exam
クラスの辞書を出力すると、
{
…省略
'math_grade': <property object at 0x0000019E44954E08>,
…省略
のように、プロパティとして扱われていることがわかります。
インスタンス辞書を出力
{'_math_grade': 60}
となります。
インスタンスには、プロパティが現れない動作をします。
C#との違い
- プロパティは、アノテーションで区別して宣言する
- プロパティ自体は、クラスの属性(インスタンスの属性ではない)として宣言される
クラスの属性として宣言される部分は、別途説明します。