2018-10-19 pygameの継承、書き換え、メモリ管理、認識
7053 ワード
一、クラスの継承Pythonクラスは継承をサポートし、マルチ継承をサポート 1、継承とは
親(スーパークラス):継承されたクラス子:親を継承するクラスは、子に親の属性とメソッドを直接持たせることです(注意:継承後も親は独自の属性とメソッドを使用します)Pythonのすべてのクラスはobjectクラスから直接または間接的に継承されます
2、受け継ぐ方法
構文:
3、何かを受け継ぐ
直接所有属性とメソッド継承可能:オブジェクト属性、オブジェクトメソッド、クラスフィールド、クラスメソッド、静的メソッド、すべて継承可能継承不可:プライベートの表面上で継承できない(Pythonに本当のプライベートがない)注意:設定されている場合_slots__魔法は現在のクラスのオブジェクトを拘束し、現在のクラスのオブジェクトの__をもたらします.dict__属性が存在しない継承後_slots__の値はサブクラスのオブジェクトには拘束されませんが、サブクラスのオブジェクトの_dict__現在のクラスに追加されている属性のみ
二、書き直す継承後の子は親の属性とメソッドを使用しますが、自分の属性額メソッド を追加することもできます.
1、新しい方法を追加する
直接サブクラスに新しいメソッドを宣言し、新しいメソッドはサブクラスでのみ使用できます.
2、書き換えa.子クラスが親クラスを継承する方法で、子クラスでこの方法の機能を再実現する(完全書き換え) b.サブクラスメソッドでsuper()を通過する.親メソッド親メソッド対応メソッド機能を保持(一部書き換え) 3、クラス内の関数の呼び出しプロセス
クラスメソッド方法呼び出しプロセス:現在のクラスにこのメソッドがあるかどうかを見て、ある場合は現在のクラスの対応するメソッドを直接呼び出します. 現在のクラスの親に対応するメソッドを見つけなければ、呼び出す 親が見つからない場合は、ベースクラス(object)が見つかるまで順次クラスを検索します objectで見つからない場合、プログラムは異常です(上を探すだけで下を探すことはありません)
三、オブジェクト属性とクラスフィールドの追加
1、フィールドの追加サブクラスに直接新しいフィールドを宣言 2、オブジェクト属性
子クラスは、親クラスのinitメソッドを継承することによって親クラスのオブジェクト属性を継承します.子クラスにinitメソッドがない場合、子クラスの構築メソッドによってオブジェクトが作成されると、親クラスのinitメソッドが自動的に呼び出されます.
練習:
人间を宣言して、名前、年齢、IDcard、人类のオブジェクトを作成する时必ず名前に名前を割り当てなければならなくて、年齢とIDcardは1つの学生のクラスを宣言することができて、名前、年齢、IDcard、学号、成绩、学生を作成する时必ず学号に値を割り当てなければならなくて、年齢の名前に値を割り当てることができて、身分证の番号と成绩に値を与えることができません
3、多態継承すると多態(同じ事物の多様な形態) 四、演算子のリロード
1、演算子とは演算子リロード:クラスの対応する魔法方法を実現することによって、クラスのオブジェクトに対応する演算子 をサポートさせる
2.gt(>)とlt(<)は一般的に1つだけ実現すればよいリスト要素はクラスのオブジェクト sortを使用してリストをソート(演算より大きいオブジェクトを実現)
五、メモリ管理メカニズム
1、メモリ管理とはPythonでのメモリ管理(自動管理):原理ゴミ回収メカニズム メモリ構造:スタック区間とスタック区間、スタック区間のメモリはシステムが自動的にスタック区間を解放するメモリを開くために手動で申請し、解放する必要があるが、現在の多くのプログラミング言語は、スタック内のメモリに関する独自の管理案を提供しており、pythonにおけるゴミ回収メカニズムはメモリの解放 を管理するために使用されている.
2、メモリスペースを開拓する過程
Pythonのデータはすべてスタックに存在し、データのアドレス(変数)はスタック区間Pythonで変数に値を付与するとスタックに空間が開き、データに対応するアドレスを変数に返し、スタックに存在する.しかし、データが数値と文字列の場合、キャッシュ領域でこのデータが以前に作成されたかどうかを確認し、なければスペースストレージデータを作成し、アドレスを下げて返し、前に作成された場合は直接前のアドレスを返します.
3、メモリの解放(ゴミ回収メカニズム)
原理:システムは一定時間ごとに=現在のプログラム内のすべてのオブジェクトの参照カウント値が0であるかどうかを検査し、参照カウントが0である場合、オブジェクトに対応するメモリが破棄され、0でない場合は破棄されません.
4、参照数
各オブジェクトには、現在のオブジェクトが参照されている回数を格納する参照カウント属性があり、sysモジュールのgetrefcountでオブジェクトの参照カウント値を取得できます.
5、参照数を増やす:参照を増やす(現在のオブジェクトアドレスを保存する変数の数を増やす)
6、引用数を減らすa.del削除参照(変数) b.格納対象アドレス変数の値を変更 六、pygameモジュールpygameはPythonが2 Dゲームを書くためのサードパーティライブラリ
親(スーパークラス):継承されたクラス子:親を継承するクラスは、子に親の属性とメソッドを直接持たせることです(注意:継承後も親は独自の属性とメソッドを使用します)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、書き換え
クラスメソッド方法
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、フィールドの追加
子クラスは、親クラスの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つだけ実現すればよい
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、メモリ管理とは
2、メモリスペースを開拓する過程
Pythonのデータはすべてスタックに存在し、データのアドレス(変数)はスタック区間Pythonで変数に値を付与するとスタックに空間が開き、データに対応するアドレスを変数に返し、スタックに存在する.しかし、データが数値と文字列の場合、キャッシュ領域でこのデータが以前に作成されたかどうかを確認し、なければスペースストレージデータを作成し、アドレスを下げて返し、前に作成された場合は直接前のアドレスを返します.
3、メモリの解放(ゴミ回収メカニズム)
原理:システムは一定時間ごとに=現在のプログラム内のすべてのオブジェクトの参照カウント値が0であるかどうかを検査し、参照カウントが0である場合、オブジェクトに対応するメモリが破棄され、0でない場合は破棄されません.
4、参照数
各オブジェクトには、現在のオブジェクトが参照されている回数を格納する参照カウント属性があり、sysモジュールのgetrefcountでオブジェクトの参照カウント値を取得できます.
import sys
aa = [1, 2, 3, 4]
print(sys.getrefcount(aa))
5、参照数を増やす:参照を増やす(現在のオブジェクトアドレスを保存する変数の数を増やす)
6、引用数を減らす
#
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() # ( )