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

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

ただいまの
回答率

90.52%

  • Python

    7904questions

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

  • Python 3.x

    6316questions

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

属性を付ける為だけにクラスでまとめるのはあり?

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 159

puroko3

score 112

pythonで変数や関数を属性を付ける為だけにクラスでまとめるのはありだと思いますか?
以下一例です。

def read_txt():
    ...

def readlines_txt():
    ...

def creat_txt():
    ...


class txt:
    def read():
        ...

    def readlines():
        ...

    def creat():
        ...
PATH_ONE = "PATH_1"
PATH_TWO = "PATH_2"
PATH_THREE = "PATH_3"


class path:
    ONE = "PATH_1"
    TWO = "PATH_2"
    THREE = "PATH_3"

見てわかるように、インスタンス変数がないので、属性を付ける為だけにクラス化をしていますが、pythonではあまりこういうコードは見かけないような気がするので、好ましくないのかなと思い悩んでいます。競合のしにくさと引き換えに冗長になったり、ネストが深くなるので。

自分だったらする、しないだけでもいいので、意見をお聞きしたいです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • quiqui

    2018/05/09 23:43

    上の方のコードですが、passと書いてある部分が「本当は実装が入るのだけどここでは省略」という意図なのか、本当にpassと書いたコードを書いておきたいだけなのかパッと区別がつきません。前者であればEllipsisオブジェクト https://docs.python.jp/3.6/library/stdtypes.html#the-ellipsis-object のリテラル ... を書く方が慣習にあっているかと思います。

    キャンセル

  • puroko3

    2018/05/10 00:08

    なるほど、pass以外は知りませんでした。修正しておきます。

    キャンセル

回答 3

checkベストアンサー

+3

アリだと思いますが、求められる場面は案外少ないように思います。

  • 属性名を付けることにより、意味付けを図りたい場合
    namedTupleや、辞書の方が適切です。
  • 複数の対等な属性をまとめたい場合
    enumの方が適切です。
  • 他言語でいう名前空間を利用したい場合
    Pythonではモジュールで同様の機構を表現できます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/10 00:26

    回答ありがとうございます!
    純粋に名前空間を使うという意味合いが大きかったのですが、やはりモジュールを使った方が良さげですね...
    enumは知らなかったのでとても勉強になりました。
    また機会があればお願いします。

    キャンセル

+2

class path:のコードの方だけ!

クラス名と値を見る限りでは外部設定情報(json)などに持つ形の方が良いと思いますが。

クラスで定義すると重複定義ミスをしてもIDEで警告がでるだけですが、
enumのuniqueデコレータを使用すると、実行時例外(TypeError: Attempted to reuse key:)を送出できます。

# -*- coding: utf-8 -*-
from enum import Enum, unique


@unique
class FilePath(Enum):
    ONE = "PATH_1"
    TWO = "PATH_2"
    THREE = "PATH_3"


def main() ->None:
    print(FilePath.ONE.value)
    print(FilePath.TWO.value)
    print(FilePath.THREE.value)


if __name__ == '__main__':
    main()

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/10 00:35

    回答ありがとうございます!
    定数をまとめる時は、enumの方が良さそうですね。uniqueデコレータも勉強になりました。
    次から使っていこうと思います。
    また機会があればお願いします。

    キャンセル

+2

クラスではなくtxtpathモジュールにまとめる方が、よりフラットになるので良い気がします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/10 00:42

    回答ありがとうございます!
    ふむ、やはりパッケージやファイルにまとめた方がよさげですか...
    モジュールの方がいいという意見が多いので、モジュール分割中心で考えていきたいと思います。
    また機会があればお願いします。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    7904questions

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

  • Python 3.x

    6316questions

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