Pythonにおけるオブジェクト指向プログラミング


Python is a fantastic programming language that allows you to use both functional and object-oriented programming paradigms.



Pythonプログラマは、基本的なオブジェクト指向プログラミングの概念を使用する必要があります.
一般的なOOPフレームワークの4つのコアの側面は、Pythonのオブジェクト指向プログラミングシステムでサポートされています.
  • カプセル化
  • の抽象化
  • 遺産
  • の多形
  • このチュートリアルでは、これらの機能を簡単に見て、それらといくつかの練習を取得します.

    Pythonにおけるオブジェクト指向プログラミング概念


    クラスとオブジェクトは何ですか?
    Pythonは、他のすべてのオブジェクト指向言語のように、オブジェクトを作成するためにクラスを定義することができます.Pythonでは、文字列、リスト、辞書などのPythonで最も一般的なデータ型です.
    クラスは、特定のオブジェクト型を定義するインスタンス変数と関連メソッドのコレクションです.クラスのオブジェクトの青写真やテンプレートと考えることができます.属性はクラスを構成する変数に与えられる名前です.
    プロパティの定義されたセットを持つクラスインスタンスをオブジェクトと呼びます.その結果、同じクラスを必要に応じて多くのオブジェクトを構築するために使用できます.
    ブックセラーの販売ソフトのためのブックというクラスを定義しましょう.
    class Book:
        def __init__(self, title, quantity, author, price):
            self.title = title
            self.quantity = quantity
            self.author = author
            self.price = price
    
    コンストラクタとしても知られているInit特別メソッドは、タイトル、数量、著者、および価格などの属性を持つブッククラスを初期化するために使用されます.
    Pythonでは、組み込みクラスは小文字で名前が付けられますが、ユーザー定義のクラスはCamelまたはSnakeケースで名前が付けられます.
    このクラスは任意の数のオブジェクトにインスタンス化できます.次のコード例では、3つの書籍が例示されています.
    book1 = Book('Book 1', 12, 'Author 1', 120)
    book2 = Book('Book 2', 18, 'Author 2', 220)
    book3 = Book('Book 3', 28, 'Author 3', 320)
    
    Book 1、Book 2、Book 3はクラスブックの別のオブジェクトです.属性のselfは対応するインスタンス(オブジェクト)を指します.
     print(book1)
     print(book2)
     print(book3)
    
    出力:
    <__main__.Book object at 0x00000156EE59A9D0>
    <__main__.Book object at 0x00000156EE59A8B0>
    <__main__.Book object at 0x00000156EE59ADF0>
    
    オブジェクトのクラスとメモリ位置は、印刷されたときに印刷されます.私たちは、彼らがタイトル、著者名などのような特質に関する特定の情報を提供するのを期待することができません.しかし、reprと呼ばれる特定のメソッドを使うことができます.
    Pythonでは、特別なメソッドは、2つのアンダースコアを開始して終了する定義関数です.
    class Book:
        def __init__(self, title, quantity, author, price):
            self.title = title
            self.quantity = quantity
            self.author = author
            self.price = price
    
        def __repr__(self):
            return f"Book: {self.title}, Quantity: {self.quantity}, Author: {self.author}, Price: {self.price}"
    
    
    book1 = Book('Book 1', 12, 'Author 1', 120)
    book2 = Book('Book 2', 18, 'Author 2', 220)
    book3 = Book('Book 3', 28, 'Author 3', 320)
    
    print(book1)
    print(book2)
    print(book3)
    
    出力:
    Book: Book 1, Quantity: 12, Author: Author 1, Price: 120
    Book: Book 2, Quantity: 18, Author: Author 2, Price: 220
    Book: Book 3, Quantity: 28, Author: Author 3, Price: 320
    
    カプセル化
    カプセル化はクライアントが特定のプロパティにアクセスするのを防ぐプロセスです.
    プライベート属性はアクセスできない属性で、情報隠蔽は特定の属性をプライベートにするプロセスです.あなたの個人的な特性を宣言する2つのアンダースコアを使用します.
    本クラスでは、チェックイン割引という個人属性を紹介しましょう.
    class Book:
        def __init__(self, title, quantity, author, price):
            self.title = title
            self.quantity = quantity
            self.author = author
            self.price = price
            self.__discount = 0.10
    
        def __repr__(self):
            return f"Book: {self.title}, Quantity: {self.quantity}, Author: {self.author}, Price: {self.price}"
    
    
    book1 = Book('Book 1', 12, 'Author 1', 120)
    
    print(book1.title)
    print(book1.quantity)
    print(book1.author)
    print(book1.price)
    print(book1.__discount)
    
    出力:
    Book 1
    12
    Author 1
    120
    Traceback (most recent call last):
      File "C:\Users\ashut\Desktop\Test\hello\test.py", line 19, in <module>
        print(book1.__discount)
    AttributeError: 'Book' object has no attribute '__discount'
    
    すべての属性は、プライベート属性の残高割引を除いて印刷されることがわかります.プライベート属性にアクセスするには、Getterメソッドとsetterメソッドを使用します.
    次のコード例でプライスプロパティを非公開にし、プライス属性を指定するためにsetterメソッドを使用し、価格属性を取得するためのゲッター関数を使用します.
    class Book:
        def __init__(self, title, quantity, author, price):
            self.title = title
            self.quantity = quantity
            self.author = author
            self.__price = price
            self.__discount = None
    
        def set_discount(self, discount):
            self.__discount = discount
    
        def get_price(self):
            if self.__discount:
                return self.__price * (1-self.__discount)
            return self.__price
    
        def __repr__(self):
            return f"Book: {self.title}, Quantity: {self.quantity}, Author: {self.author}, Price: {self.get_price()}"
    
    今回、私たちは2冊のオブジェクトを作ります、1冊の購入のための1つと大量の本の購入のためのもう一つ.大量の書籍を購入している間、私たちは20 %の割引を得るので、その場合には割引を20 %に設定するためにsetHeight Discount ()メソッドを使用します.
    single_book = Book('Two States', 1, 'Chetan Bhagat', 200)
    
    bulk_books = Book('Two States', 25, 'Chetan Bhagat', 200)
    bulk_books.set_discount(0.20)
    
    print(single_book.get_price())
    print(bulk_books.get_price())
    print(single_book)
    print(bulk_books)
    
    出力:
    200
    160.0
    Book: Two States, Quantity: 1, Author: Chetan Bhagat, Price: 200
    Book: Two States, Quantity: 25, Author: Chetan Bhagat, Price: 160.0
    
    継承
    遺伝はoopの最重要特性と考えられる.別のクラスからメソッドや特性を継承するクラスの能力は継承として知られています.
    サブクラスまたは子クラスは継承するクラスです.スーパークラスまたは親クラスは、メソッドや属性を継承するクラスです.
    つの新しいクラスは、我々の書店の販売ソフトウェアに加えられました:新しいクラスとアカデミックなクラス.
    書籍が小説やアカデミックに分類されているかに関わらず、タイトルと作者のような類似した属性を持っているかもしれません.新しいクラスごとにそのコードを書き直すことは時間、労力、メモリの無駄です.
    class Book:
        def __init__(self, title, quantity, author, price):
            self.title = title
            self.quantity = quantity
            self.author = author
            self.__price = price
            self.__discount = None
    
        def set_discount(self, discount):
            self.__discount = discount
    
        def get_price(self):
            if self.__discount:
                return self.__price * (1-self.__discount)
            return self.__price
    
        def __repr__(self):
            return f"Book: {self.title}, Quantity: {self.quantity}, Author: {self.author}, Price: {self.get_price()}"
    
    
    class Novel(Book):
        def __init__(self, title, quantity, author, price, pages):
            super().__init__(title, quantity, author, price)
            self.pages = pages
    
    
    class Academic(Book):
        def __init__(self, title, quantity, author, price, branch):
            super().__init__(title, quantity, author, price)
            self.branch = branch
    
    それらを視覚化するためにこれらのクラスのオブジェクトを作成しましょう.
    novel1 = Novel('Two States', 20, 'Chetan Bhagat', 200, 187)
    novel1.set_discount(0.20)
    
    academic1 = Academic('Python Foundations', 12, 'PSF', 655, 'IT')
    
    print(novel1)
    print(academic1)
    
    出力:
    Book: Two States, Quantity: 20, Author: Chetan Bhagat, Price: 160.0
    Book: Python Foundations, Quantity: 12, Author: PSF, Price: 655