web-dev-qa-db-ja.com

なぜPythonでクラスを使用する必要があるのですか?

私はPythonの非常にアマチュア学習者であり、最近、クラスの概念の学習を開始しました。クラスの概念は(非常に)大まかに理解できますが、なぜクラスを書く代わりにいくつかの関数を書くことができないのか理解できませんか?

たとえば、(私は Interactive python から学んでいます)与えられた演習の1つ(クラスを使用して書くことになっています)は次のとおりです。

  1. distanceFromPointをパラメーターとして受け取り、そのポイントと自分の間の距離を計算することを除いて、distanceFromOriginと同様に機能するPointメソッドを追加します。

  2. メソッド_reflect_x_をPointに追加して、新しいPointを返します。これは、x軸に関する点の反射です。たとえば、Point(3, 5).reflect_x()は_(3, -5)_です。

彼らはこのようなクラスを使用してコードを書きました:

_import math

class Point:
    """ Point class for representing and manipulating x,y coordinates. """

def __init__(self, initX, initY):
    """ Create a new point at the given coordinates. """
    self.x = initX
    self.y = initY

def getX(self):
    return self.x

def getY(self):
    return self.y

def distanceFromOrigin(self):
    return ((self.x ** 2) + (self.y ** 2)) ** 0.5

def distanceFromPoint(self, otherP):
    dx = (otherP.getX() - self.x)
    dy = (otherP.getY() - self.y)
    return math.sqrt(dy**2 + dx**2)

p = Point(3, 3)
q = Point(6, 7)

print(p.distanceFromPoint(q))
_

次のように単純に記述できるのに、なぜクラスを使用する必要があるのですか。

_def distanceFromPoint(p,q): # they are tuples
    y = (p[0]-q[0])**(2)+(p[1]-q[1])**(2)
    return y**(1/2)

def reflectx(p):
    return (p[0],-p[1])

p = (3,3)
q = (6,7)
_
18
user6038537

OOPを使用する大きな利点の1つは、拡張性です。

ポイントの形で大量のデータを処理するアプリケーションを書いたとしましょう。顧客は仕様に、各ポイントのx座標とy座標だけでなく、アプリが各ポイントの色を知る必要があることを追加します。

各ポイントをタプルとして保存するコードを記述した場合、(x, y)、色を3番目の値として追加する場合があります:(x, y, colour)。しかし、データ形式を変更したためにコードが破損している場所を見つけるために、すべてのコードを調べる必要があります。クラスを使用した場合は、Pointを継承し、必要な機能を追加する新しいクラスを定義するだけで済みます。

class ColouredPoint(Point):
    """ Class for points which are coloured, based on Point """

    def __init__(self, initX, initY, initCol):
        Point.__init__(self, initX, initY)
        self.colour = initCol

p = ColouredPoint(3, 3, "green")
q = ColouredPoint(6, 7, "red")
r = Point(8, 4)

print(p.distanceFromPoint(q))
print(p.colour)
print(p.distanceFromPoint(r))

Pointクラスで機能するすべてのコードは、新しいクラスでも機能します。また、Pointクラスの定義を作成していない、または変更できない場合でも、これを行うことができます。

16
nekomatic

クラスの外で関数を宣言できます。しかし、それらをクラスに格納することは、一般的にプログラミングにおいてより良い習慣です。 OOPは読みやすく再利用可能であると見なされます。

この場合、2つのpoints間の距離はポイントに依存するため、このクラスにdistanceFromPointメソッドを含めることは論理的です。

また、クラスを使用すると、Pointsからの距離を計算するよりも確実になり、3つ以上の座標などの不適切な値を含む可能性のあるタプルの場合はそうなりません。

4
Shiho

ポイントの例は、クラスの使用を正当化するのに悪い例です。

クラスは、データを操作するのではなく、何かを記述する優れた方法です。したがって、ポイントには、それを説明する2ビットの情報があります(とにかく2D空間で)。

映画ファイルのような、もっと抽象的なものを考えてください。映画には、タイトル、期間、ジャンル、俳優、年齢、人気、言語、賞など、あらゆる種類の情報が関連付けられています。このすべての情報の長いリストを処理する関数を作成してみてください。クラスのメリットがすぐにわかります。

数学は、おそらくそれほど多くのコンテキスト情報がなく、いくつかの変数があり、すべてを定義する1つの領域です。実世界のデータはあまり明確に定義されていないため、クラスの拡張性の恩恵を受けます。

1
dodell