ゼロ基礎入門学習Python(36)--類と対象:対象を紹介する


インテリジェントポイント
Python 3オブジェクト向け
Pythonはデザイン当初からオブジェクト向けの言語だったので、Pythonでクラスやオブジェクトを作成するのは簡単です.この章では、Pythonのオブジェクト向けプログラミングについて詳しく説明します.
もしあなたが以前オブジェクト向けのプログラミング言語に接触したことがないならば、あなたはまずいくつかのオブジェクト向け言語のいくつかの基本的な特徴を理解して、頭の中で1つの基本的なオブジェクト向けの概念を形成して、このようにPythonのオブジェクト向けのプログラムをもっと簡単に学ぶのに役立つかもしれません.
次に、以下のオブジェクトの基本的な特徴を簡単に理解します.
オブジェクト向けテクノロジーの概要
  • クラス(Class):同じ属性とメソッドを持つオブジェクトのセットを記述するために使用されます.コレクション内の各オブジェクトに共通するプロパティとメソッドを定義します. .
  • メソッド:クラスで定義された関数.
  • クラス変数:クラス変数は で共通です.クラス変数はクラス内で定義され、関数体の外にあります.クラス変数は通常、インスタンス変数として使用されません.
  • インスタンス変数:現在のインスタンスのクラスにのみ使用されるメソッド内の変数を定義します.
  • データ・メンバー:クラス変数またはインスタンス変数は、クラスおよびそのインスタンス・オブジェクトに関するデータを処理するために使用されます.
  • メソッド書き換え:親クラスから継承されたメソッドが子クラスのニーズを満たすことができない場合は、メソッドの上書き(override)と呼ばれ、メソッドの書き換えとも呼ばれるメソッドを書き換えることができます.
  • 継承:派生クラス(derived class)がベースクラス(base class)を継承するフィールドとメソッドです.継承により、派生クラスのオブジェクトをベースクラスオブジェクトとして扱うこともできます.
  • インスタンス化:クラスのインスタンス、クラスの特定のオブジェクトを作成します.
  • オブジェクト:クラスによって定義されたデータ構造のインスタンス.オブジェクトには、2つのデータ・メンバー(クラス変数とインスタンス変数)とメソッドが含まれます.

  • Pythonは他のプログラミング言語と比較して,できるだけ新しい文法や意味を増やさずにクラスメカニズムを加えた.
    Pythonのクラスはオブジェクト向けにプログラミングするすべての基本機能を提供しています.クラスの継承メカニズムは複数のベースクラスを許可し、派生クラスはベースクラスの任意の方法を上書きすることができ、方法ではベースクラスの同名の方法を呼び出すことができます.
    オブジェクトには、任意の数とタイプのデータを含めることができます.
    クラス定義
    構文の形式は次のとおりです.
    class ClassName:
        1>
        .
        .
        .
        N>

    クラスをインスタンス化すると、そのプロパティを使用できます.実際には、クラスを作成した後、クラス名でそのプロパティにアクセスできます.
    クラスオブジェクト
    クラスオブジェクトは、 の2つの操作をサポートします.
    属性参照はPythonのすべての属性参照と同じ標準構文:obj.nameを使用します.
    クラスオブジェクトが作成されると、クラスネーミングスペース内のすべてのネーミングが有効な属性名になります.クラス定義が次のように定義されている場合:
    #         
    class Myclass:
    
        #   :
        i  = 12345
    
        #   :
        def f(self):
            return 'hello world'
    
    #     
    x = Myclass()
    
    #   
    print('Myclass      i  :',x.i)
    print('Myclass      f    :',x.f())
    

    以上、新しいクラスインスタンスを作成し、そのオブジェクトをローカル変数x、xが空のオブジェクトに割り当てました.
    ===    ===
    
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    Myclass      i  : 12345
    Myclass      f    : hello world

    多くのクラスは、オブジェクトを初期状態に作成する傾向があります.したがって、クラスは、次のように__int__()の特殊なメソッド(構築メソッド)を定義することができます.
    def __init__(self):
        self.data = []

    クラスが__init__() を定義すると、クラスのインスタンス化操作は__init()メソッドを自動的に呼び出す.次の例では、新しいインスタンスを作成できます.
    x = Myclass()

    もちろん、__init__()メソッドにはパラメータがあり、パラメータは__init__()を介してクラスのインスタンス化動作に伝達される.例:
    class Complex:
        def __init__(self,realpart,imagpart):
            self.r = realpart
            self.i = imagpart
    
    x = Complex(3.0, -4.5)
    
    print(x.r,x.i)
    
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    3.0 -4.5

    selfはクラスのインスタンスを表し、クラスではありません.
    クラスのメソッドは、通常の関数とは特別な違いがあります.
    これらには、selfという慣例に従って、追加の最初のパラメータ名が必要です.
    class Test:
        def prt(self):
            print(self)
            print(self.__class__)
    
    t = Test()
    t.prt()
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    <__main__.test object="" at="" class="hljs-number">0x00000014F5E029E8>
    <class '__main__.Test'>

    実行結果から明らかなように、selfはクラスのインスタンスを表し、現在のオブジェクトのアドレスを表し、self.__class__はクラスを指す.
    selfはpythonキーワードではなく、他のキーワードに変更しても正常に実行できます.
    class Test:
        def prt(zz):
            print(zz)
            print(zz.__class__)
    
    t = Test()
    t.prt()
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    <__main__.test object="" at="" class="hljs-number">0x000000C5A4402978>
    <class '__main__.Test'>

    クラスのメソッド
    クラスの内部では、defキーワードを使用してメソッドを定義します.一般的な関数定義とは異なり、クラスメソッドにはパラメータselfが含まれ、最初のパラメータであるselfはクラスのインスタンスを表します.
    class People:
        #       
        name = ''
        age = 0
        #       ,                
        __weight = 0
        #       
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print('%s  :  %d  。' % (self.name,self.age))
    
    #     1
    p = People('  ',10,30)
    p.speak()
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
        :  10#     2
    p = People('  ',10)
    p.speak()
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    Traceback (most recent call last):
      File "D:/untitled/Python_learn/test1.py", line 16, in 
        p = People('  ',10)
    TypeError: __init__() missing 1 required positional argument: 'w'

    継承
    Pythonは同様にクラスの継承をサポートしており,一つの言語が継承をサポートしなければクラスには意味がない.派生クラスの定義は次のとおりです.
    class DerivedClassName(BaseClassName1):
        
        .
        .
        .
        N>

    カッコ内のベースクラスの順序に注意してください.ベースクラスに同じメソッド名があり、サブクラスで使用するときに指定されていない場合は、Pythonが左から右に検索します.つまり、メソッドがサブクラスに見つからない場合は、左から右にベースクラスにメソッドが含まれているかどうかを検索します.
    BaseClassName(例のベースクラス名)は、派生クラスと1つの役割ドメイン内で定義する必要があります.クラスに加えて、ベースクラスが別のモジュールで定義されている場合、式を使用することもできます.
    class DerivedClassName(modname.BaseClassName)
    #    
    class People:
        #       
        name = ''
        age = 0
        #       ,                
        __weight = 0
        #       
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print('%s  :  %d  。' % (self.name,self.age))
    
    #      
    class Student(People):
        grade = ''
        def __init__(self,n,a,w,g):
            #          
            People.__init__(self,n,a,w)
            self.grade = g
        #        
        def speak(self):
            print('%s  :  %d  ,    %d   ' % (self.name, self.age,self.grade))
    
    s = Student('  ',10,60,3)
    s.speak()
    
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
        :  103   

    マルチ継承
    Pythonも同様に限られたサポートマルチ継承形式である.複数継承クラスの定義は次の例です.
    class DerivedClassName(Base1, Base2, Base3):
        
        .
        .
        .
        N>

    カッコ内の親の順序に注意してください.親に同じメソッド名があり、子クラスで使用するときに指定されていない場合は、pythonが左から右に検索します.つまり、メソッドが子クラスで見つからない場合は、親クラスにメソッドが含まれているかどうかを左から右に検索します.
    #    
    class People:
        #       
        name = ''
        age = 0
        #       ,                
        __weight = 0
        #       
        def __init__(self,n,a,w):
            self.name = n
            self.age = a
            self.__weight = w
        def speak(self):
            print('%s  :  %d  。' % (self.name,self.age))
    
    #      
    class Student(People):
        grade = ''
        def __init__(self,n,a,w,g):
            #          
            People.__init__(self,n,a,w)
            self.grade = g
        #        
        def speak(self):
            print('%s  :  %d  ,    %d   ' % (self.name, self.age,self.grade))
    
    #     ,        
    class Speaker():
        topic = ''
        name = ''
        def __init__(self,n,t):
            self.name = n
            self.topic = t
        def speak(self):
            print("   %s,       ,        %s" % (self.name, self.topic))
    
    #     
    class Sample(Speaker,Student):
        a = ''
        def __init__(self,n,a,w,g,t):
            Student.__init__(self,n,a,w,g)
            Speaker.__init__(self,n,t)
    
    test = Sample('  ',25,80,4,'Python')
    test.speak()  #     ,                  
    
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
         ,       ,        Python

    メソッド書き換え
    親メソッドの機能があなたのニーズを満たすことができない場合は、子メソッドで親メソッドを書き換えることができます.例は次のとおりです.
    #     
    class Parent:
        def mymethod(self):
            print('      ')
    
    #     
    class Child(Parent):
        def mymethod(self):
            print('      ')
    
    #      
    c = Child()
    #         
    c.mymethod()
    #                 
    super(Child,c).mymethod() #super()          (  )     。
    
    
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
          
          
    

    クラスのプロパティとメソッド
    クラスのプライベート属性__private_attrs:2つの下線の先頭に、この属性がプライベートであることを宣言し、クラスの外部で使用または直接アクセスできません.クラス内のメソッドでは、self.__private_attrsが使用されます.
    クラスのメソッド
    クラス内では、defキーワードを使用してメソッドを定義し、一般的な関数定義とは異なり、クラスメソッドはパラメータselfを含まなければならず、最初のパラメータであり、selfはクラスのインスタンスを表す.
    クラスのプライベートメソッド__private_method:2つの下線の先頭に、このメソッドがプライベートメソッドであることを宣言し、クラスの内部でのみ呼び出され、クラスの外部で呼び出されません.self.__private_methods
    クラスのプライベート属性の例は次のとおりです.
    
    class JustCounter:
        __secretCount = 0 #     
        publicCount = 0   #     
    
        def count(self):
            self.__secretCount += 1
            self.publicCount += 1
            print(self.__secretCount)
    
    counter = JustCounter()
    
    counter.count()
    
    counter.count()
    
    print(counter.publicCount)
    
    print(counter.__secretCount) #  ,          
    
    
    ===    ===
    
    1
    2
    2
    Traceback (most recent call last):
      File "D:/untitled/Python_learn/test1.py", line 18, in 
        print(counter.__secretCount) #  ,          
    AttributeError: 'JustCounter' object has no attribute '__secretCount'

    クラスのプライベートメソッドの例は次のとおりです.
    class Site:
        def __init__(self,name,url):
            self.name = name        #public
            self.__url = url        #private
    
        def who(self):
            print('name : ',self.name)
            print('url :',self.__url)
    
        def __foo(self):           #    
            print('      ')
    
        def foo(self):            #    
            print('      ')
            self.__foo()
    
    x = Site('    ','https://blog.csdn.net/wanbin6470398/')
    
    x.who()
    ===    ===
    name :      
    url : https://blog.csdn.net/wanbin6470398/
    
    x.foo()
    ===    ===
          
          
    
    x.__foo()
    ===    ===
    Traceback (most recent call last):
      File "D:/untitled/Python_learn/test1.py", line 21, in 
        x.__foo()
    AttributeError: 'Site' object has no attribute '__foo'
    
    

    クラスの独自の方法
  • __init__:コンストラクション関数で、オブジェクトの生成時に
  • を呼び出す.
  • __del__:構造関数、オブジェクトを解放するときに
  • を使用
  • __repr__:印刷、変換
  • __setitem__:インデックスに従って
  • を割り当てる
  • __getitem__:インデックスに従って値
  • を取得
  • __len__:長さ
  • を得る
  • __cmp__:比較演算
  • __call__:関数呼び出し
  • __add__:加算
  • __sub__:減算
  • __mul__:乗算
  • __div__:除算
  • __mod__:余演算
  • を求める
  • __pow__:乗方
  • 演算子の再ロード
    Pythonは同様に演算子のリロードをサポートしており、クラスの独自の方法をリロードすることができます.例は次のとおりです.
    class Vector:
        def __init__(self,a,b):
            self.a = a
            self.b = b
    
        def __str__(self):
            return 'Vector(%d,%d)' % (self.a,self.b)
    
        def __add__(self, other):
            return Vector(self.a + other.a,self.b + other.b)
    
    v1 = Vector(2,10)
    v2 = Vector(5,-2)
    
    print(v1 + v2)
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
    Vector(7,8)

    授業後の練習問題.
    テスト問題
  • オブジェクトのプロパティと方法は、プログラミングで実際に何ですか?
  •   (  )   (  )
  • クラスとオブジェクトの関係は何ですか?
  •                              。
                        ,                    ,
                       。
  • クラスを定義したら、 クラスによってインスタンス化されたオブジェクトを想像できますか?
  •    ,   ,Tom,Hello Kitty
  • クラスの定義は、それほど「擬物」ではない場合があります.抽象的な場合があります.例えば、矩形クラスを定義すると、どのような属性と方法を追加しますか.
  •         ,         、   
  • クラスの属性定義はできるだけ抽象的にすべきか、それともできるだけ具体的にすべきか.
  •               ,              。
  • オブジェクト向けのいくつかの特徴を一言で要約してください.
  •   :            
      :                  
      :                ,       
  • 関数と方法の違いは何ですか?
  •        self

    手を動かす
  • 次のプロンプトに従ってPersonクラスを定義し、クラスインスタンスオブジェクトを生成しようとします.属性:名前(デフォルト名は「小甲魚」)の方法:名前のヒントを印刷する:方法の中で属性に対する参照形式にselfを加える必要がある、例えばself.name
  • class Person:
        name = '   '
    
        def printName(self):
           print(self.name)
    
    a = Person()
    a.printName()
    
    ===    ===
    D:\untitled\venv\Scripts\python.exe D:/untitled/Python_learn/test1.py
       
  • 次のプロンプトに従って矩形クラスを定義し、クラスインスタンスオブジェクトを生成しようとします.属性:長さと幅の方法:長さと幅を設定->setRect(self)、長さと幅を取得->getRect(self)、面積を取得->getArea(self)ヒント:方法では属性の参照形式にself(selfなど)を追加する必要がある.name
  • >>> class Rectangle:
        length = 5
        width = 4
    
        def setRect(self):
            print('         ...')
            self.length = float(input(' :'))
            self.width = float(input(' :'))
    
        def getRect(self):
            print('       : %.2f,   : %.2f' % (self.length,self.width))
    
        def getArea(self):
            return self.length * self.width
    
    >>> a = Rectangle()
    >>> a.getRect()
           : 5.00,   : 4.00
    >>> a.setRect()
             ...
     :56
    
    >>> a.getRect()
           : 5.00,   : 6.00
    
    >>> a.getArea()
    30.0