サーチ…


構文

  • x.title # Accesses the title attribute using the dot notation
  • x.title = "Hello World" # Sets the property of the title attribute using the dot notation
  • @property # Used as a decorator before the getter method for properties
  • @title.setter # Used as a decorator before the setter method for properties

ドット表記を使用した基本属性アクセス

サンプルクラスを受けましょう。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

book1 = Book(title="Right Ho, Jeeves", author="P.G. Wodehouse")

Pythonでは、ドット記法を使用してクラスの属性タイトルにアクセスできます。

>>> book1.title 
'P.G. Wodehouse'

属性が存在しない場合、Pythonはエラーをスローします:

>>> book1.series
Traceback  (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Book' object has no attribute 'series'

セッター、ゲッター&プロパティ

データのカプセル化のために、他の属性から値が得られる属性を持つことが必要な場合もあります。また、一般に、その時点でどの値が計算されるのかがあります。この状況を処理する標準的な方法は、getterまたはsetterと呼ばれるメソッドを作成することです。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

上記の例では、タイトルと著者を含む新しいブックを作成するとどうなるかを簡単に確認できます。ライブラリに追加するすべての図書に著者とタイトルが含まれている場合は、ゲッターとセッターをスキップしてドット表記を使用できます。しかし、著者がいない書籍があり、著者に「不明」を設定したいとします。あるいは、著者に複数の著者がいて、著者のリストを返す予定がある場合。

この場合、 author属性のgetterとsetterを作成できます。

class P:
    def __init__(self,title,author):
        self.title = title
        self.setAuthor(author)

    def get_author(self):
        return self.author

    def set_author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

この方式はお勧めしません。

1つの理由は、キャッチがあるということです。パブリック属性を持ち、メソッドを持たないクラスを設計したとしましょう。人々はすでにこれを多く使用しており、次のようなコードを書いています。

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!

今私たちには問題があります。 著者は属性ではないので! Pythonは、この問題のプロパティーを解決するソリューションを提供しています。プロパティを取得するメソッドは、ヘッダの前に@propertyで修飾されています。私たちがセッターとして機能させたいメソッドは、その前に@ attributeName.setterで装飾されています。

これを念頭に置いて、新しい更新クラスを用意しました。

class Book:
    def __init__(self, title, author):
        self.title = title
        self.author = author

    @property
    def author(self):
        return self.__author

    @author.setter
    def author(self, author):
        if not author: 
            self.author = "Unknown"
        else:
            self.author = author

通常、Pythonでは、同じ名前と異なる数のパラメータを持つ複数のメソッドを持つことはできません。しかし、この場合Pythonではデコレータが使用されているため、これが可能です。

コードをテストすると:

>>> book = Book(title="Ancient Manuscript", author="Some Guy")
>>> book.author = ""  #Cos Some Guy didn't write this one!
>>> book.author 
Unknown 


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow