質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1167閲覧

プロパティのgetterの引数について

scarlet256

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2022/10/14 18:25

Python初心者です。後学のためにブログを見漁っていたところ気になったコードがあったので質問させていただきます。

引用元: https://qiita.com/Yukimura127/items/c04e5498b82cd69d19fc

ソースコード

「実装」という節で載せてあったソースコードです。

PythonでのPriorityQueueではキューに追加したアイテム同士を数値として比較できる場合,その数値が低い方が優先度が高くなります.
この性質を利用して,intの優先度の他にキューに追加した時間もキューアイテムに保持して比較対象とします.
そうすることで,キューに追加した順番でアイテムを取得できます.

Main.py

1import time 2from typing import Any, Tuple, Optional 3from dataclasses import dataclass, field, asdict 4import queue 5 6 7@dataclass(order=True) 8class QueueItem: 9 """ 10 キューアイテム 11 """ 12 priority: int 13 item: Any = field(compare=False) 14 occurred: float = field(default=0.0, compare=True) 15 16 17class PriorityQueue(queue.PriorityQueue): 18 """ 19 時間を加味した優先度付きキュークラス 20 """ 21 22 def __init__(self, priority_name: str = "priority"): 23 """ 24 Args: 25 priority_name: 優先度の変数名 26 """ 27 self.priority_name: str = priority_name 28 super().__init__() 29 30 @property 31 def max_priority(self, priority_name: Optional[str] = None) -> int: 32 """ 33 最大のpriorityを取得 34 """ 35 if not self.queue: 36 return 0 37 priority_name = priority_name or self.priority_name 38 assert hasattr(self.queue[0], priority_name) 39 40 max_priority = max([queue_item.priority for queue_item in self.queue]) 41 return max_priority 42 43 def put_item(self, **kwargs): 44 """ 45 put override 46 """ 47 # プライオリティ+登録順で優先順位を決めたい 48 if kwargs.get("occurred", None) is None: 49 kwargs["occurred"] = time.perf_counter() 50 51 # アイテム作成・追加 52 queue_item = QueueItem(**kwargs) 53 super().put(queue_item) 54 55 def get_item(self) -> Tuple[Any, ...]: 56 """ 57 get override 58 """ 59 queue_item: QueueItem = super().get() 60 item = tuple(asdict(queue_item).values()) 61 return item

質問

気になったのが30行目のプロパティ定義のコードなのですが……

Main.py

1@property 2def max_priority(self, priority_name: Optional[str] = None) -> int: 3 """ 4 最大のpriorityを取得 5 """ 6 if not self.queue: 7 return 0 8 priority_name = priority_name or self.priority_name 9 assert hasattr(self.queue[0], priority_name) 10 11 max_priority = max([queue_item.priority for queue_item in self.queue]) 12 return max_priority

プロパティの getterなのにも関わらず、引数 priority_nameを持っています。
getterself以外の引数を持たず、また引数を渡す方法もないと勉強したので何故引数が……?と混乱しています。そこで質問なのですが

  • getterに引数を渡すことはできるのか
  • また、渡せるとしてどのような場面で推奨されるのか

この2点をお答えいただければ幸いです。回答よろしくお願いします。


引用元のブログ様、無断で引用してしまい申し訳ございません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

getterに引数を渡すことはできるのか

できなくはないのですが、getter としての意味(意義)は薄くなるので、引数を付けるくらいなら @property デコレータを外して通常のインスタンスメソッドにすればよいのでは?と思います。

以下は Built-in Functions: class property に記載されているサンプルコードを一部改変したものです。

python

1from typing import Optional 2 3class Parrot: 4 def __init__(self): 5 self._voltage = 100000 6 7 @property 8 def voltage(self, factor: Optional[int] = 1) -> int: 9 return self._voltage * factor 10 11if __name__ == '__main__': 12 p = Parrot() 13 print(p.voltage) 14 print(Parrot.voltage.fget(p, -1)) 15 16# => 17100000 18-100000

投稿2022/10/15 04:08

melian

総合スコア19803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scarlet256

2022/10/15 14:13

なるほど……プロパティ.fget経由でメソッドにアクセスすれば引数を渡せるのですね! 引数の(p, -1)はそれぞれgetterに設定された関数voltageの仮引数(self, factor: Optional[int] = 1)に渡され、p._voltage * -1が返される……という感じでしょうか。selfにインスタンス名を指定して参照できるのは初めて知りました。 >getter としての意味(意義)は薄くなるので やはり引数を渡すなら普通のメソッドとして実装したほうが良いのですね。 とても参考になりました。回答ありがとうございます!
guest

0

getterに引数を渡すことはできます。
取り出す値を選択したり加工したり、用途はいろいろあると思いますよ。

投稿2022/10/14 18:40

shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

scarlet256

2022/10/14 19:08

回答ありがとうございます!getterに引数を渡すことができるのですね。差し支えなければどのように引数を渡すのか例文を書いていただけないでしょうか……調べてみてもちょっとよく分からなくて……すいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問