LoginSignup
1
1

More than 1 year has passed since last update.

Pythonのsetterとgetterの書き方

Posted at

Pythonでsetterとgetterの書き方をまとめました。

とりあえず結論から

@propertyを使う

property.py
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を使うには

use1.py
...
person = Person()

# nameをsetする場合
person.name = '佐藤'
person.age = 20

# nameをgetする場合
print('名前は', person.name, 'です')  # 名前は 佐藤 です
print('年齢は', person.age, '歳です') # 年齢は 20 です

余談:Javaっぽく書いてみる

likeJava.py
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記事となれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1