pythonオブジェクト向けの3つの特徴-パッケージ、継承、マルチステート


一、パッケージ化:オブジェクト向けプログラミングでは、すべてのクラスは通常、外部に直接クラス内部にアクセスさせる属性と方法が少なく、外部クラスにボタンを提供し、その内部のメンバーにアクセスしてプログラムの安全性を保証する.
  • 1>パッケージはオブジェクト向けプログラミングの大きな特徴である
  • 2>オブジェクト向けプログラミングの第一歩は、属性と方法を抽象的なクラスにカプセル化する
  • である.
  • 3>外部でクラスを使用してオブジェクトを作成し、オブジェクトにメソッド
  • を呼び出す.
  • 4>オブジェクトメソッドの詳細はクラスの内部例1:
  • にカプセル化する.
    class Person:
        def __init__(self, name, weight):
            self.name = name
            self.weight = weight
    
        def __str__(self):
            return '  %s,   %.2f' % (self.name, self.weight)
    
        def run(self):
            print '%s    ' % self.name
            self.weight -= 0.5
    
        def eat(self):
            print '%s   ' % self.name
            self.weight += 1
    
    #     xiaoming xiaomei
    xiaoming = Person('  ', 75.0)
    xiaomei = Person('  ', 45.0)
    
    print xiaoming
    xiaoming.run()
    xiaoming.eat()
    print xiaoming
    
    print xiaomei
    xiaomei.run()
    # """    """
    #     ,   75.00
    #       
    #      
    #     ,   75.50
    #     ,   45.00
    #       

    例2:
    class Student:
        def __init__(self, name, age):
            self.__name = name
            self.__age = age
    
        def setter(self, name, age):
            if not isinstance(name, str):
                raise TypeError("          ")
            if not isinstance(age, int):
                raise TypeError("         ")
    
            self.__name = name
            self.__age = age
    
        def tell(self):
            print("      :%s\t%s" % (self.__name, self.__age))
    
    if __name__ == '__main__':
        student = Student("Alex", 25)
        student.tell()
        student.setter("Tom", 40)
        student.tell()
    """    """
    #       :Alex   25
    #       :Tom    40

    二、継承
  • 1、あるクラスは既存のクラスからその既存の属性と方法を獲得し、この現象をクラスの継承
  • と呼ぶ.
  • 2、メソッド書き換えとは、親クラスに存在するメソッドを子クラスで再定義することを意味し、この現象をメソッドの書き換え
  • と呼ぶ.
  • 3、AクラスがBクラスを継承すると、aaオブジェクトはAであり、Bであり、継承は誰が誰であるかの関係を反映し、誰が誰であるかの場合にのみ、継承でコード冗長性の問題を解決することができる.
  • 4、属性と方法を探す順序の問題:まず対象の自分のネーミング空間から探して、それから自分のクラスの中で、最後に親の中から
  • を探します
  • 5、python 3では、すべてのクラスが新式であり、すべてのクラスが直接または間接的にObject
  • を継承する.
  • 6、pythonでは、新しいクラスは1つ以上の親クラスの例1を継承することができる:単一継承1.継承の概念:子クラスは親クラスのすべての属性と方法を持っている(子クラスは独自の方法をカプセル化するだけである).構文classクラス名(親):defサブクラス特有のメソッド
  • # _*_ coding:utf-8 _*_
    class Animal:
        def eat(self):
            print ' '
    
        def drink(self):
            print ' '
    
        def run(self):
            print ' '
    
        def sleep(self):
            print ' '
    
    class Cat(Animal):
        #               
        def call(self):
            print '  ~'
    
    kitty = Cat()
    kitty.eat()
    kitty.drink()
    kitty.run()
    kitty.sleep()
    kitty.call()
    """    """
    #  
    #  
    #  
    #  
    #   ~

    CatクラスはAnimalのすべての属性とメソッドを継承し、Catクラスは独自のメソッドを定義します.
    例2:受け継がれた伝達性受け継がれた伝達性:通俗的に言えば(おじいさんとお父さんと息子の関係)
  • CクラスはBクラスから継承する、BクラスはAクラスから
  • を継承する.
  • では、CクラスはBクラスとAクラスのすべての属性と方法を有する.
  • # _*_ coding:utf-8 _*_
    class Animal:
        def eat(self):
            print ' '
        def drink(self):
            print ' '
        def run(self):
            print ' '
        def sleep(self):
            print ' '
    
    class Cat(Animal):
        #               
        def call(self):
            print '  ~'
    
    class Hellokitty(Cat):
        def speak(self):
            print '      '
    
    #     Hellokitty  
    kt = Hellokitty()
    kt.speak()
    kt.call()
    
    #                       
    kt.eat()
    kt.drink()
    kt.sleep()
    kt.run()
    """    """
    #       
    #   ~
    #  
    #  
    #  
    #  

    例3:メソッドの書き換え
  • 親を上書きする方法(親を書き換える方法)
  • 親メソッドを拡張
  • # _*_ coding:utf-8 _*_
    class Cat(object):
        #               
        def call(self):
            print '  ~'
    
    class Hellokitty(Cat):
        def speak(self):
            print '      '
        def call(self):
            # 1.         ,    
            print '   ~'
            # 2.              
            Cat.call(self)
    
    kt =Hellokitty()
    #      ,        
    #     ,                       
    kt.call()
    """    """
    #    ~
    #   ~

    例4:マルチ継承
  • 子クラスは単一継承
  • という親クラスを持つ.
  • 子クラスは、複数の親クラスを持つことができ、すべての親クラスの属性およびメソッド
  • を有する.
  • 例えば、子供は自分の父と母の特徴を受け継ぐ
  • class A(object):
        def test(self):
            print 'A---------test   '
        def demo1(self):
            print 'A--------demo  '
    class B(object):
        def test(self):
            print 'B -------test  '
        def demo2(self):
            print 'B ---------demo   '
    
    class C(B,A):
        """          ,              """
        pass
    
    #       
    c = C()
    c.test()
    c.demo2()
    """    """
    # B -------test  
    # A--------demo  

    マルチ継承CクラスはAクラスもBクラスも継承しており,オブジェクトcがメソッドを呼び出す場合,AクラスとBクラスのメソッドが同名であれば,CクラスがAとBを継承する際に誰かが前に書いて誰かのメソッドを呼び出す.同名でない場合は、対応するクラスのメソッドを直接呼び出します.
    補足:新式クラスと旧式クラス新式クラスと旧式(古典)クラスobjectはPythonがすべてのオブジェクトに提供するベースクラスであり、dir関数を使用して表示できるいくつかの組み込み属性と方法を提供します.
  • 新式クラス:objectをベースクラスとするクラス、
  • の使用を推奨
  • クラシッククラス:objectをベースクラスとしないクラス、
  • の使用は推奨されません.
    python 3.Xで定義されたクラスの場合、親クラスが指定されていない場合、ベースクラスとしてobjectがデフォルトで使用されます.python 3.xで定義されたクラスはすべてpython 2で新しいクラスです.xでクラスを定義場合、親クラスが指定されていない場合、objectをベースクラスとして新式クラス新式クラスと旧式クラスを推奨する方法の検索順序に影響し、作成コードがpython 2と同時に使用できるようにする.xとpython 3.x実行、今後クラスを定義する際、親がいない場合はobjectクラスから統一的に継承することを推奨
    >>> class A(object):
    ...     pass
    ...
    >>> a = A()
    >>> dir(a) #          
    >>> class B:
    ...     pass
    ...
    >>> b=B()
    >>> dir(b)

    Pythonの初期にはclassの定義に多くの面で深刻な問題があった.彼らがそれを認めた時はもう遅すぎたので、やむを得ず、このような問題のあるclassを支持する必要があります.既存の問題を解決するためには、「新しいクラス」を導入する必要があります.そうすれば、「古いクラス」は引き続き使用でき、新しい正しいクラスも使用できます.これは「クラスはオブジェクト」という概念を用いて、小文字の「object」という言葉をクラスとして、新しいクラスを作成するときに継承することを決定します.
    三、多態多態はパッケージと継承を前提とする.
  • 1>マルチステートは、コードの柔軟性を向上させることができる
  • 2>親を継承および書き換える方法を前提とする
  • 3>呼び出しメソッドは、クラスの内部設計例に影響しません:
  • # _*_ coding:utf-8 _*_
    class Dog(object):
        def __init__(self, name):
            self.name = name
    
        def game(self):
            print '   ...'
    
    class GoldDog(Dog):
        def game(self):
            print '    ...'
    
    class Person(object):
        def __init__(self, name):
            self.name = name
    
        def game(self, dog):
            print '%s   %s     ' % (self.name, dog.name)
    
    dog = Dog('  ')
    # dog = GoldDog('    ')
    XiaoMing = Person('  ')
    XiaoMing.game(dog)
    """  1:   GoldDog      """
    #             
    
    """  2:   Dog      """
    #