見出し画像

【Python】Enum型をさらに活用したい

先日、この記事をまとめた際にPythonでもEnum型が作れるようになったわけですが、さらに活用していきたいと思います。

一つのラベルに対して複数の値を持たせる

今回やりたいのは、「メンバーズカードの画像から、名前・住所・電話番号を取得したい。名前は赤、住所は緑、電話番号は青い枠で囲まれている(それぞれの色はRGB値で固定されているものと仮定する)。【領域名-色名-RGB値】の組み合わせをEnum型で管理したい」と言うような感じ。

まず通常通りEnum型のclassを作って行きます

from enum import Enum

class TemplateColor(Enum):
    NAME = 1
    ADRESS = 2
    TELL = 3

よいしょ。

これだとまだ領域名が列挙できただけなので、これに色名とRGB値を持たせます。

from enum import Enum

class TemplateColor(Enum):
    NAME = (1, "赤" ,[255, 0, 0])
    ADRESS = (2 , "緑", [0, 255, 0])
    TELL = (3 , "青", [0, 0, 255]) 

こんな感じ。色名は本当は無くてもいいんですけど、RGB値だけだと色名パッと見で分からなくて不便極まりないので添えてあります。(コメントで添えても良かったかもしれないけどまあ、複数の値持たせる実験ってことで……)

次に、各項目に3つずつある値に名前を付けて、アクセスできるようにします。

from enum import Enum

class TemplateColor(Enum):
    NAME = (1, "赤" ,[255, 0, 0])
    ADRESS = (2 , "緑", [0, 255, 0])
    TEL = (3 , "青", [0, 0, 255])
    
    def __init__(self, id, color_name, rgb) -> None:
        super().__init__()
        self.id = id
        self.color_name = color_name
        self.rgb = rgb

どうもこの辺りのしくみがいまいち分からないんですけど、コンストラクタを作って、その引数に、各項目に与えた値の1つめ、2つめ、3つめが何を意味しているか名前を与えて、インスタンス変数に格納して上げると、特にインスタンスを作らなくても

TemplateColor.NAME.rgb

でアクセス出来るようになります。なんでじゃろ。

Forで回せる

Enum型はForでうりゃーって回せます。今回で言えば、「名前取る処理、住所取る処理、電話番号取る処理」を

for area in TemplateColor:
    area_name = area.name  # NAME , ADDRESS , TEL
    aera_rgb = area.rgb
    value = get_value(area_rgb) # rgb値を与えたら値が返ってくる素晴らしい処理

で一気に行えます。わーいべんりー

BGR値も取得出来るようにしたいので、@propertyを使ってみる

この先の画像処理に繋げる為に、RGB値じゃなくてBGR値が必要になります。

RGB値は使うことはないので最初からBGR値を入れておけばいい気もするんですが、コード後から修正するとき絶対訳が分からなくなると思うので、値としてはRGB値を入れておき、変換メソッドを噛ませてBGR値を受け取れるようにしようと思います。

そんなときは@propertyを使うと良い様です。

from enum import Enum

class TemplateColor(Enum):
    NAME = (1, "赤" ,[255, 0, 0])
    ADRESS = (2 , "緑", [0, 255, 0])
    TELL = (3 , "青", [0, 0, 255])
    
    def __init__(self, id, color_name, rgb) -> None:
        super().__init__()
        self.id = id
        self.color_name = color_name
        self.rgb = rgb
           
   @property
   def bgr(self):
       r = self.rgb[0]
       g = self.rgb[1]
       b = self.rgb[2]
       return [b, g, r]

相変わらず仕組みがよく分からないんですが、こうしておくと

TemplateColor.NAME.bgr

でアクセスすると

[0, 0, 255]

が返ってきます。やったー。

この記事が気に入ったらサポートをしてみませんか?