7

Python で多くのスクリプトを作成して、実験データを分析およびプロットしたり、理論がデータにどのように適合するかをテストするための簡単なシミュレーションを作成したりしています。スクリプトは非常に手続き型になる傾向があります。いくつかのプロパティを計算し、他のプロパティを計算し、プロパティをプロットし、プロットを分析します...

プロシージャを書くだけでなく、クラスを使用する利点はありますか? 実際の分析を関数に埋め込むことができるので、データを関数に渡して実行させることができますが、関数はクラスに含まれていません。

クラスはどのような欠点を克服し、手続き的に記述できる場合、クラスを使用する目的は何ですか?

これが私の謝罪の前に投稿された場​​合は、その方向に私を向けてください.

4

5 に答える 5

15

オブジェクト指向プログラミングを使用することにより、関連する関数を持つオブジェクトが得られます。これらのオブジェクトは、そのプロパティ(内部変数)を変更する唯一の方法です(すべきです)。

と呼ばれる関数を持つのが一般的でしたがtrim_string(string)stringクラスを使用すると実行できstring.trim()ました。この違いは、主に、個々のコンポーネント間の結合を最小限に抑えるためにできる限りのことを行う必要がある、大きく複雑なモジュールを実行する場合に顕著になります。

継承のようにOOPを含む他の概念もありますが、知っておくべき本当に重要なことは、OOPは、操作(関数)の観点から考えるのではなく、操作とメッセージパッシング(メソッド/動詞)を持つオブジェクトについて考えさせることです。/動詞)と基本要素(変数)

オブジェクト指向パラダイムの重要性は、言語メカニズムにおいては、思考および設計プロセスほど重要ではありません。

この質問も見てください。

構造化プログラミングには本質的に何も問題はありませんいくつかの問題がオブジェクト指向設計によりよくマッピングされているだけです。

たとえば、SP言語で次のようにすることができます。

#Pseudocode!!!

function talk(dog):
    if dog is aDog:
        print "bark!"
    raise "IS NOT A SUPPORTED ANIMAL!!!"

>>var dog as aDog
>>talk(dog)
"bark!"
>>var cat as aCat
>>talk(cat)
EXCEPTION: IS NOT A SUPPORTED ANIMAL!!!

# Lets add the cat
function talk(animal):
    if animal is aDog:
        print "bark!"
    if animal is aCat:
        print "miau!"
    raise "IS NOT A SUPPORTED ANIMAL!!!"

OOPを使用している間は、次のようになります。

class Animal:
     def __init__(self, name="skippy"):
         self.name = name
     def talk(self):
         raise "MUTE ANIMAL"

class Dog(Animal):
     def talk(self):
         print "bark!"

class Cat(Animal):
     def talk(self):
         print "miau!"

>>dog = new Dog()
>>dog.talk()
"bark!"
>>cat = new Cat()
>>cat.talk()
"miau!"

SPでは、追加するすべての動物に別の動物を追加し、動物の名前を格納する別の変数iftalk追加し、モジュール内のすべての関数にタッチする必要があります。OOPでは、クラスを検討できます。残りの部分から独立しているように。グローバルな変更がある場合は変更しAnimal、狭い変更の場合はクラス定義を確認するだけです。

単純でシーケンシャルな、場合によっては使い捨てのコードの場合、構造化プログラミングを使用しても問題ありません。

于 2009-09-17T18:13:28.930 に答える
4

Python でクラスを使用する必要はありません。OOP を強制する必要はありません。機能的なスタイルに慣れている場合は、それで問題ありません。バリエーションのある抽象化をモデル化したいときにクラスを使用し、クラスを使用してそれらのバリエーションをモデル化します。「クラス」という言葉が示すように、これらは主に、作業対象が自然にさまざまなクラスに分類される場合に役立ちます。大規模なデータセットを操作するだけの場合は、OOP パラダイムに従う必要があるとは思いませんでした。

于 2009-09-17T18:46:28.480 に答える
1

「しかし、関数はクラスに含まれていません。」

彼らはそうかもしれません。

class Linear( object ):
    a= 2.
    b= 3.
    def calculate( self, somePoint ):
        somePoint['line']= b + somePoint['x']*a

class Exponential( object ):
    a = 1.05
    b = 3.2
    def calculate( self, somePoint ):
        somePoint['exp']= b * somePoint['x']**a

class Mapping( object ):
    def __init__( self ):
        self.funcs = ( Linear(), Exponential() )
    def apply( self, someData ):
        for row in someData:
            for f in self.funcs:
                f.calculate( row )

これで、計算はクラスにラップされます。委任構成コマンドなどのデザインパターンを使用して、スクリプトを簡素化できます。

于 2009-09-17T18:54:19.377 に答える
1

OOPは、複雑なプログラムに適しています。これは、現実世界の概念の状態と動作をキャプチャし、それらの間の相互作用を調整するのに最適です。優れたオブジェクト指向コードは、読みやすく、理解しやすく、データの整合性を保護し、コードの再利用を最大化します。コードの再利用は、頻繁に使用する計算をクラスに保持することの大きな利点の1つだと思います。

于 2009-09-17T19:01:28.900 に答える
1
  • オブジェクト指向プログラミングは、すべてのコーディングの問題を解決できるわけではありません。

  • Python では、関数はオブジェクトです。オブジェクトと関数を好きなだけ組み合わせることができます。

  • 関数を持つモジュールは、すでにプロパティを持つオブジェクトです。

  • 多くの同じ変数 (状態) を渡していることに気付いた場合は、おそらくオブジェクトの方が適しています。クラスメソッドを含むクラスがたくさんある場合、またはselfあまり使用しないメソッドがある場合は、おそらく関数の方が適しています。

于 2009-09-19T02:16:08.127 に答える