Pythonでsetterとgetterの書き方をまとめました。
とりあえず結論から
@propertyを使う
class Person
def __init__(self, name, age):
self._name = name
self._age = age
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._name = value
@property
def age(self):
return self._age
@age.setter
def age(self, value):
self._age = value
このClassを使うには
...
person = Person()
# nameをsetする場合
person.name = '佐藤'
person.age = 20
# nameをgetする場合
print('名前は', person.name, 'です') # 名前は 佐藤 です
print('年齢は', person.age, '歳です') # 年齢は 20 です
余談:Javaっぽく書いてみる
class Person
def __init__(self):
self._name = name
self._age = age
def getName(self):
return self.__name
def setName(self, name):
self.__name = name
def getAge(self):
return self.__age
def setAge(self, age):
self.__age = age
PythonとJavaは両方ともオブジェクト思考のプログラミング言語ですが
書き方がこうも異なってきます。
Pythonでは@propertyを使ってsetter/getterを記述し、プロパティを呼び出すと自動的にgetterが呼び出され、プロパティに値を設定するとsetterが呼び出されます。
このようにPythonではClassの関数をプロパティ名にマッピングすることができるので、getterとsetterをプロパティ名で定義する必要が無いです。
一方で、Javaはgetterとsetterを明示的に定義する必要があります。
getterはgetNameのようなネーミングで、setterはsetNameのようなネーミングが一般的です。
Javaではプロパティを定義するために、フィールドにgetterとsetterを定義することが一般的になっています。
Pythonはシンプルな書き方が重視されており、Javaは静的な型付けを重視しており、どちらも異なる思考を持っているため、今回のように書き方に違いがあると思います。
備考
私はjavaからエンジニアとしての人生が始まったため
レガシー(Java的な)setName(name)やgetName(id)のような書き方が染み付いています。
近年はPythonがメインとなったため、あまり気にしていませんが
昔を思い出して今回記事にしてみました。
自分と同じように昔はJava、今はPythonでコードを書いているよ!という人のホッとする1記事となれば幸いです。