Python でクラスを使うべきなのはいつですか? 質問する

Python でクラスを使うべきなのはいつですか? 質問する

私は約 2 年間 Python でプログラミングをしてきました。主にデータ関連 (pandas、mpl、numpy) ですが、自動化スクリプトや小規模な Web アプリも開発しています。私はより優れたプログラマーを目指し、Python の知識を増やしたいと思っていますが、クラスを使用したことがないことが気になっています (小規模な Web アプリ用にランダムな Flask コードをコピーした以外は)。クラスが何であるかは大体理解していますが、単純な関数よりもクラスが必要な理由がよくわかりません。

質問の具体性を高めるために、私は大量の自動レポートを作成していますが、これには常に複数のデータ ソース (mongo、sql、postgres、apis) からデータを取得し、多かれ少なかれデータの加工とフォーマットを実行し、データを csv/excel/html に書き込んで、メールで送信することが含まれます。スクリプトの範囲は、約 250 行から約 600 行です。これを行うためにクラスを使用する理由はありますか?また、その理由は何ですか?

ベストアンサー1

授業はオブジェクト指向プログラミングOOP は、コードの編成、再利用性、カプセル化を重視します。

まず、免責事項:OOPは、関数型プログラミングこれは、Python でよく使用される異なるパラダイムです。Python (またはほとんどの言語) でプログラミングするすべての人が OOP を使用するわけではありません。Java 8 では、あまりオブジェクト指向ではない多くのことを行うことができます。OOP を使用したくない場合は、使用しないでください。二度と使用しないデータを処理するための 1 回限りのスクリプトを作成するだけの場合は、今のままの方法で書き続けてください。

ただし、OOP を使用する理由はたくさんあります。

いくつかの理由:

  • 構成: OOP は、コード内のデータと手順の両方を記述および定義するための、よく知られた標準的な方法を定義します。データと手順は両方とも、さまざまな定義レベル (異なるクラス) で保存でき、これらの定義について話すための標準的な方法があります。つまり、OOP を標準的な方法で使用すると、後で自分自身や他の人がコードを理解、編集、使用しやすくなります。また、複雑で任意のデータ ストレージ メカニズム (辞書の辞書、リスト、辞書、セットの辞書のリストなど) を使用する代わりに、データ構造の一部に名前を付けて、簡単に参照することができます。

  • 状態: OOP は状態の定義と追跡に役立ちます。たとえば、典型的な例として、生徒を処理するプログラム (成績プログラムなど) を作成する場合、生徒に関する必要なすべての情報 (名前、年齢、性別、学年、コース、成績、教師、仲間、食事、特別なニーズなど) を 1 か所に保管できます。このデータは、オブジェクトが存続する限り保持され、簡単にアクセスできます。対照的に、純粋な関数型プログラミングでは、状態がインプレースで変更されることはありません。

  • カプセル化: カプセル化により、手順とデータが一緒に保存されます。メソッド(OOP用語で関数)は、それが操作して生成するデータのすぐ横に定義されます。Javaのような言語では、アクセス制御、または Python では、パブリック API の記述方法に応じて、メソッドとデータをユーザーから隠すことができます。つまり、コードを変更する必要がある、または変更したい場合、コードの実装に対して何でも好きな操作を行うことができますが、パブリック API はそのままにしておくことができます。

  • 継承: 継承を使用すると、データとプロシージャを 1 か所 (1 つのクラス) で定義し、後でその機能をオーバーライドまたは拡張できます。たとえば、Python では、dict追加機能を追加するためにクラスのサブクラスを作成する人を頻繁に見かけます。一般的な変更は、存在しない辞書からキーが要求されたときに例外をスローするメソッドをオーバーライドして、不明なキーに基づいてデフォルト値を指定することです。これにより、今すぐまたは後で自分のコードを拡張したり、他の人が自分のコードを拡張できるようにしたり、他の人のコードを拡張したりすることができます。

  • 再利用性: これらすべての理由とその他の理由により、コードの再利用性が向上します。オブジェクト指向コードを使用すると、堅牢な (テスト済みの) コードを一度記述すれば、何度でも再利用できます。特定のユースケースに合わせて調整する必要がある場合は、既存のクラスを継承して、既存の動作を上書きできます。何かを変更する必要がある場合は、既存のパブリック メソッド シグネチャを維持しながらすべてを変更でき、誰にも気づかれません (願わくば)。

繰り返しになりますが、OOP を使用しない理由はいくつかあり、また、使用する必要はありません。しかし、幸いなことに、Python のような言語では、少しだけ使用することも、たくさん使用することもできます。それはあなた次第です。

学生の使用例の例 (コードの品質は保証されませんが、単なる例です):

オブジェクト指向

class Student(object):
    def __init__(self, name, age, gender, level, grades=None):
        self.name = name
        self.age = age
        self.gender = gender
        self.level = level
        self.grades = grades or {}

    def setGrade(self, course, grade):
        self.grades[course] = grade

    def getGrade(self, course):
        return self.grades[course]

    def getGPA(self):
        return sum(self.grades.values())/len(self.grades)

# Define some students
john = Student("John", 12, "male", 6, {"math":3.3})
jane = Student("Jane", 12, "female", 6, {"math":3.5})

# Now we can get to the grades easily
print(john.getGPA())
print(jane.getGPA())

標準辞書

def calculateGPA(gradeDict):
    return sum(gradeDict.values())/len(gradeDict)

students = {}
# We can set the keys to variables so we might minimize typos
name, age, gender, level, grades = "name", "age", "gender", "level", "grades"
john, jane = "john", "jane"
math = "math"
students[john] = {}
students[john][age] = 12
students[john][gender] = "male"
students[john][level] = 6
students[john][grades] = {math:3.3}

students[jane] = {}
students[jane][age] = 12
students[jane][gender] = "female"
students[jane][level] = 6
students[jane][grades] = {math:3.5}

# At this point, we need to remember who the students are and where the grades are stored. Not a huge deal, but avoided by OOP.
print(calculateGPA(students[john][grades]))
print(calculateGPA(students[jane][grades]))

おすすめ記事