2018-10-19 pygameの継承、書き換え、メモリ管理、認識

7053 ワード

一、クラスの継承
  • Pythonクラスは継承をサポートし、マルチ継承をサポート
  • 1、継承とは
    親(スーパークラス):継承されたクラス子:親を継承するクラスは、子に親の属性とメソッドを直接持たせることです(注意:継承後も親は独自の属性とメソッドを使用します)Pythonのすべてのクラスはobjectクラスから直接または間接的に継承されます
    2、受け継ぐ方法
    構文:
    class   (    ):
            
    

    3、何かを受け継ぐ
    直接所有属性とメソッド継承可能:オブジェクト属性、オブジェクトメソッド、クラスフィールド、クラスメソッド、静的メソッド、すべて継承可能継承不可:プライベートの表面上で継承できない(Pythonに本当のプライベートがない)注意:設定されている場合_slots__魔法は現在のクラスのオブジェクトを拘束し、現在のクラスのオブジェクトの__をもたらします.dict__属性が存在しない継承後_slots__の値はサブクラスのオブジェクトには拘束されませんが、サブクラスのオブジェクトの_dict__現在のクラスに追加されている属性のみ
    class Person(object):
        num = 73
        __i = 80
        __slots__ = ('name', 'age')
        def __init__(self,name = '  ',age = 16):
            self.name = name
            self.age = age
            self.__sex = 'nan'
    
        def eat(self):
            print('%s   ' % self.name)
    
        @staticmethod
        def fun1():
            print('  Person    ')
    
        @classmethod
        def show_num(cls):
            print('%d     ' % cls.num)
    
    class Student(Person):
        pass
    
    stu1 = Student()
    print(stu1.name, stu1.age)
    stu1.eat()
    print(stu1.num)
    stu1.show_num()
    stu1.fun1()
    print(stu1.__dict__)
    stu1.id = '001'
    print(stu1.__dict__)
    
    

    二、書き直す
  • 継承後の子は親の属性とメソッドを使用しますが、自分の属性額メソッド
  • を追加することもできます.
    1、新しい方法を追加する
    直接サブクラスに新しいメソッドを宣言し、新しいメソッドはサブクラスでのみ使用できます.
    2、書き換え
  • a.子クラスが親クラスを継承する方法で、子クラスでこの方法の機能を再実現する(完全書き換え)
  • b.サブクラスメソッドでsuper()を通過する.親メソッド親メソッド対応メソッド機能を保持(一部書き換え)
  • 3、クラス内の関数の呼び出しプロセス
    クラスメソッド方法
  • 呼び出しプロセス:現在のクラスにこのメソッドがあるかどうかを見て、ある場合は現在のクラスの対応するメソッドを直接呼び出します.
  • 現在のクラスの親に対応するメソッドを見つけなければ、呼び出す
  • 親が見つからない場合は、ベースクラス(object)が見つかるまで順次クラスを検索します
  • objectで見つからない場合、プログラムは異常です(上を探すだけで下を探すことはありません)
  • class Person:
        def __init__(self, name = ''):
            self.name = name
    
        def eat(self, food):
            print('%s  %s' % (self.name, food))
    
        @classmethod
        def get_up(cls):
            print('  ')
            print('   ')
    
        @staticmethod
        def run():
            print('   ')
    
    class Student(Person):
        def study(self):
            print('%s    ' % self.name)
    
        @staticmethod
        def run():
            print('    ')
    
        @classmethod
        def get_up(cls):
            # super()        
            # super()      
            super().get_up()   #      get_up   
            print('   ')
    
        def eat(self, food):
            # super()         
            super().eat(food)
            print('  ')
    
    stu1 = Student()
    per1 = Person()
    stu1.study()
    per1.run()
    stu1.run()
    Student.get_up()
    Person.get_up()
    per1.eat('apple')
    

    三、オブジェクト属性とクラスフィールドの追加
    1、フィールドの追加
  • サブクラスに直接新しいフィールドを宣言
  • 2、オブジェクト属性
    子クラスは、親クラスのinitメソッドを継承することによって親クラスのオブジェクト属性を継承します.子クラスにinitメソッドがない場合、子クラスの構築メソッドによってオブジェクトが作成されると、親クラスのinitメソッドが自動的に呼び出されます.
    class Car:
        num = 10
    
    class SportCar(Car):
        #     
        wheel_count = 4
        num = 8
        #          
        def __init__(self, color):
            #   super()      init  
            super().__init__(color)   #                   ,                
            self.power = 0
    
    print(SportCar.num, SportCar.wheel_count)
    print(Car.num)
    
    # ```
    
    

    練習:
    人间を宣言して、名前、年齢、IDcard、人类のオブジェクトを作成する时必ず名前に名前を割り当てなければならなくて、年齢とIDcardは1つの学生のクラスを宣言することができて、名前、年齢、IDcard、学号、成绩、学生を作成する时必ず学号に値を割り当てなければならなくて、年齢の名前に値を割り当てることができて、身分证の番号と成绩に値を与えることができません
    class Person:
        """  """
        def __init__(self,name,age = 0, IDcard = ''):
            self.name = name
            self.age = age
            self.IDcard = IDcard
    class Student(Person):
        """   """
        def __init__(self, stu_id, age = 0, name = ''):
            super().__init__(name)
            self.stu_id = stu_id
            self.score = 0
    
    per1 = Person('  ')
    per2 = Person('  ', 13)
    per3 = Person('  ', 13, '123456')
    
    stu1 = Student('001', 14, '  ')
    stu2 = Student('001', 14)
    stu3 = Student('001', name = '  ')
    

    3、多態
  • 継承すると多態(同じ事物の多様な形態)
  • 四、演算子のリロード
    1、演算子とは
  • 演算子リロード:クラスの対応する魔法方法を実現することによって、クラスのオブジェクトに対応する演算子
  • をサポートさせる
    2.gt(>)とlt(<)は一般的に1つだけ実現すればよい
  • リスト要素はクラスのオブジェクト
  • sortを使用してリストをソート(演算より大きいオブジェクトを実現)
  • import copy
    class Student:
        def __init__(self, name, age, score):
            self.name = name
            self.age = age
            self.score = score
        # gt             
        def __gt__(self, other):
            # stu1 > stu2
            # self            ,other           
            return self.age > other.age
    
        # lt             
        def __lt__(self, other):
            # stu1 < stu2
            # self            ,other           
            return self.age < other.age
    
        # add           
        def __add__(self, other):
            # stu1 + stu2
            # self           ,other         
            return [self.score , other.score]
    
        #             
        def __mul__(self, other):
            result = []
            if isinstance(self, Student):
                for _ in range(other):
                    result.append(copy.copy(self))
                return result
            else:
                for _ in range(self):
                    result.append(copy.copy(other))
                return result
    
            # stu1 * stu2
            # self           ,other         
    
    
    stu1 = Student('aa', 12, 78)
    stu2 = Student('bbb', 18, 90)
    
    print(stu1 > stu2)
    print(stu1 < stu2)
    print(stu1 + stu2)
    a = stu1 * 5  #    
    # 5 * stu1      
    for stu in a:
        print(stu.__dict__)
    

    五、メモリ管理メカニズム
    1、メモリ管理とは
  • Pythonでのメモリ管理(自動管理):原理ゴミ回収メカニズム
  • メモリ構造:スタック区間とスタック区間、スタック区間のメモリはシステムが自動的にスタック区間を解放するメモリを開くために手動で申請し、解放する必要があるが、現在の多くのプログラミング言語は、スタック内のメモリに関する独自の管理案を提供しており、pythonにおけるゴミ回収メカニズムはメモリの解放
  • を管理するために使用されている.
    2、メモリスペースを開拓する過程
    Pythonのデータはすべてスタックに存在し、データのアドレス(変数)はスタック区間Pythonで変数に値を付与するとスタックに空間が開き、データに対応するアドレスを変数に返し、スタックに存在する.しかし、データが数値と文字列の場合、キャッシュ領域でこのデータが以前に作成されたかどうかを確認し、なければスペースストレージデータを作成し、アドレスを下げて返し、前に作成された場合は直接前のアドレスを返します.
    3、メモリの解放(ゴミ回収メカニズム)
    原理:システムは一定時間ごとに=現在のプログラム内のすべてのオブジェクトの参照カウント値が0であるかどうかを検査し、参照カウントが0である場合、オブジェクトに対応するメモリが破棄され、0でない場合は破棄されません.
    4、参照数
    各オブジェクトには、現在のオブジェクトが参照されている回数を格納する参照カウント属性があり、sysモジュールのgetrefcountでオブジェクトの参照カウント値を取得できます.
    import sys
    aa = [1, 2, 3, 4]
    print(sys.getrefcount(aa))
    
    

    5、参照数を増やす:参照を増やす(現在のオブジェクトアドレスを保存する変数の数を増やす)
    6、引用数を減らす
  • a.del削除参照(変数)
  • b.格納対象アドレス変数の値を変更
  • 六、pygameモジュール
  • pygameはPythonが2 Dゲームを書くためのサードパーティライブラリ
  • #        
    import pygame
    
    # 1、     
    pygame.init()
    
    # 2、      
    #   、  、
    screen = pygame.display.set_mode((900, 700))
    
    #     
    # pygame.image.load(    ):       ,      
    image = pygame.image.load('./files/timg.jpg')
    
    #        
    #   .blit(    ,  (  ))     (  ):(x  , y  )
    #             
    screen.blit(image, (-700, -100))
    
    #          
    pygame.display.flip()
    
    
    # 3、      
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                print('      ')
                exit()  #     (    )