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
を持っています。
getter
は self
以外の引数を持たず、また引数を渡す方法もないと勉強したので何故引数が……?と混乱しています。そこで質問なのですが
getter
に引数を渡すことはできるのか- また、渡せるとしてどのような場面で推奨されるのか
この2点をお答えいただければ幸いです。回答よろしくお願いします。
引用元のブログ様、無断で引用してしまい申し訳ございません。

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/10/15 14:13