python 面向對象介紹
1、python 面向對象的主要特性。主要有類、對象。三大特點:封裝、繼承、多態。本次主要介紹內容:屬性、方法、構造函數、析構函數。私有方法、私有屬性。
oop 是使用類和對象來實現對真是世界的描述。萬事萬物皆可為類。基於面向對象的程序使人更加容易理解的你邏輯。提高開發效率
class 類。對具有相同屬性的對象的抽象。可以理解為模板。在類中定義了這些對象共同擁有的屬性和方法。(上帝創造地球的模板)
object 對象。對象是類的實例化。一個類可以實例化多個對象。每個對象可以具有不同的屬性。例如人。人與人既有共同屬性。也有不同屬性。
封裝。在內部調用函數。對外部是透明的(對外部不可見)。
繼承。子類可以自動繼承父類的屬性和方法
多態。一個接口,多重實現。(比喻老板說開始工作,銷售部開始銷售工作。技術部開始的開發工作)
2、面向對象。類的簡單定義。和對象實例化。
class dog: def __init__(self,name): self.name = name def bulk(self): print("wang !!!!!!! %s"%(self.name)) dog1 =dog("test1") dog2 = dog("test2") dog1.bulk() dog2.bulk()
3、寫代碼原則。
一、重復代碼是非常不好的行為
二、寫的代碼經常變更
4、類初始化深入理解: 對象創建的過程。每次創建一個對象相當於開辟一塊內存空間如r1。每次在調用函數時候。實際相當於將r1作為一個參數傳遞給類的函數
(記住:是調用類的函數。所有對象公用。並不是每個對象的內存空間都會復制這個函數體,節省內存空間)
class role : def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name self.wepon= wepon self.life_value = life_value def get_shot(self): print("I got shot") # 在內存中是完全不同的兩個對象 #role("xiajinqi","fireball") # r1 = role("xiajinqi","fireball") ‘‘‘ r1 = role("xiajinqi","fireball") 1、申請一個內存地址r1. 2、r1傳遞給類role 3、role.__init__(r1,"xiajinqi","fireball") 備註:創建一個對象。相當於開辟一塊內存空間。裏面會存儲變量等相關值。但是(類函數並沒有復制一份,只是在調用時候, 傳一個對象的內存地址來做區分不同的對象。好處就是節約內存空間), 如:role.__init__(r1,"xiajinqi","fireball") ,role.__init__(r2,"xiajinqi","fireball") ‘‘‘
內存存儲圖:
5、類變量和實例變量。 作用範圍。
當某個變量在類和實例中都存在時候。優先取實例變量
class role : n = 12345 #類變量,對象共享 name = "tset" def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name #實例變量 。未某個對象所獨享 self.wepon = wepon self.life_value = life_value def get_shot(self): print("I got shot") print(role.n,role.name) r1=role("ploice1","fireball") r2=role("ploice2","fireball") print(r1.n,r1.name) # 當name這個變量在實例和類都存在的。值先從對象開始找。沒有時候取類的變量打印值為ploice1 print(r2.n,r2.name)# 當name這個變量在對象和類種都存在的。值先從對象開始找。沒有時候取類的變量打印值為ploice2 # E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py 12345 tset 12345 ploice1 12345 ploice2 Process finished with exit code 0
6、實例化以後。變量的修改和刪除增加。 特殊說明:對象可以查類變量(實例變量不存在取類變量),但是不能修改和刪除類變量。類變量修改只能由自己修改
如:r1.n = 100
.如果n存在,就表示修改。如果n不存在。
class role : n = 12345 #類變量,對象共享 name = "tset" def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name #實例變量 。未某個對象所獨享 self.wepon = wepon self.life_value = life_value def get_shot(self): print("I got shot") print(role.n,role.name) r1=role("ploice1","fireball") r2=role("ploice2","fireball") r1.n=‘11111‘ # 相當於實例r1自己給自己創建了一個變量n,r1.n=n。。因此不會改變類變量 print(r1.n) # print(r2.n)# # 類變量依舊不能變 print(role.n) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py 12345 tset 11111 12345 12345
7、類變量修改。類變量修改只能由類自己修改。所有實例都無法直接修改類變量。
並且類變量修改的影響範圍為:實例對象中沒有改變量,需要調用類變量的實例將受到影響。
class role : n = 12345 #類變量,對象共享 name = "tset" def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name #實例變量 。未某個對象所獨享 self.wepon = wepon self.life_value = life_value def get_shot(self): print("I got shot") print(role.n,role.name) r1=role("ploice1","fireball") r2=role("ploice2","fireball") r1.n=‘11111‘ # 相當於實例r1自己給自己創建了一個變量n,r1.n=n。。因此不會改變類變量 print(r1.n) # # 修改類變量 role.n = 88888 print(r2.n) print(role.n) E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py 12345 tset 11111 88888 88888 Process finished with exit code 0
8、類變量的作業。例如:國際字段默認為中國。有少量人國際其他國際。所有未中國國際的人可以共用一個內存空間。從而節省內存。
9、析構函數。在實例銷毀、結束時候執行。通常用於關閉數據庫連接的打開的臨時文件關閉等
class role : n = 12345 #類變量,對象共享 name = "tset" def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name #實例變量 。未某個對象所獨享 self.wepon = wepon self.life_value = life_value def get_shot(self): print("I got shot") def __del__(self): print("ha game over") # 程序執行結束後。自動調用 r1=role("ploice1","fireball") r1.get_shot() r2=role("ploice1","fireball") r2.get_shot() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py I got shot I got shot ha game over ha game over
python 內存回收機制。當變量銷毀時候。會自動回收
class role : n = 12345 #類變量,對象共享 name = "tset" def __init__(self,name,wepon,life_value= 00): #構造函數 #在實例化時候。做一些初始化工作 self.name = name #實例變量 。未某個對象所獨享 self.wepon = wepon self.life_value = life_value def get_shot(self): print("I got shot") def __del__(self): print("ha game over") # 程序執行結束後。自動調用 r1=role("ploice1","fireball") r1.get_shot() del r1 r2=role("ploice1","fireball") r2.get_shot() E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py I got shot ha game over I got shot ha game over Process finished with exit code 0
10、類的繼承。簡單實用
class People : def __init__(self,name,age): self.name = name self.age = age def eat(self): print("%s eat" %(self.name)) def sleep(self): print("%s sleep" % (self.name)) class Man(People): def game(self): print("%s game" % (self.name)) def sleep(self): print("%s man is sleep" % (self.name)) # 覆蓋 def eat(self): People.eat(self) # 先調用父類。然後執行自己的函數體 print("%s eat" % (self.name)) # 重構 man1 =Man("xiajinqi","19") man1.sleep() # 繼承父類。 man1.game() # 玩遊戲。自己的類 man1.eat() #重構
11、多繼承和新式類。繼承順序。從左到右。
# 繼承優先級,先執行自己的構造方法,再去調用Relation
#class Poeple: 經典類
class People(object) : #新式類
def __init__(self,name,age):
self.name = name
self.age = age
def eat(self):
print("%s eat" %(self.name))
def sleep(self):
print("%s sleep" % (self.name))
class Relation(object):
def make_friends(self): # obj
print("make %s"%(self.name))
class Man(People,Relation): # 新式類鞋碼
def __init__(self, name, age, money):
super(Man, self).__init__(name, age)
self.money = money
def game(self):
print("%s game" % (self.name))
def sleep(self):
print("%s man is sleep" % (self.name)) # 覆蓋
def eat(self):
People.eat(self) # 先調用父類。然後執行自己的函數體
print("%s eat" % (self.name)) # 重構
man1 =Man("xiajinqi","19",‘10000‘)
man1.make_friends()
E:\Users\xiajinqi\PycharmProjects\Atm\venv\Scripts\python.exe E:/Users/xiajinqi/PycharmProjects/Atm/bin/test.py
make fir xiajinqi
Process finished with exit code 0
12、類的繼承順序。廣度優先
class shoool(object): def __init__(self,addr,name): self.addr = addr self.name = name self.students = [] self.teacher = [] def en_roll(self,obj_student): self.students.append(obj_student) print("註冊學員 %s" %(obj_student.name)) def hire(self,obj_teacher): self.teacher.append(obj_teacher) print("註冊學員 %s" % (obj_teacher.name)) class school_member(object): def __init__(self,name,age): self.name = name self.age = age def tell(self): pass class student(school_member): def __init__(self,name,age,grade): super(student,self).__init__(name,age) self.grade = grade def tell(self): print(‘‘‘ name: age: garde: ‘‘‘%(self.name,self.age,self.garde)) class teacher(school_member): def __init__(self, name,age,salary): super(teacher, self).__init__(name,age) self.salary = salary def tell(self): print(‘‘‘ name: age: salary: ‘‘‘ % (self.name, self.age, self.salary)) shoool1 = shoool("北京","老男孩") student1 = student("test1","22","一班") student2 = student("test2","22","二班") teacher1 = teacher("teacher1","33","2000000") teacher2 = teacher("teacher2","33","2000000") shoool1.en_roll(student1) shoool1.en_roll(student2) shoool1.hire(teacher1) shoool1.hire(teacher2) # 打印所有註冊老師 for student in shoool1.students : print(student.name) for teacher in shoool1.teacher : print(teacher.name)
13、多態.可以實現。統一接口多種實現。
class am(object): def __init__(self,name): print("name %s" %(name)) # 接口 def am(obj): obj.talk() class dog(am): def talk(self): print("wangwang") class cat(am): def talk(self): print("miaomiao") dog1 = dog("test1") cat2 = cat("test1") am.am(cat2)
14課後練習題目:
角色:學校、學員、課程、講師
要求:
1、創建北京、上海學校
2、創建linux/python/C++ 3個課程 linxu/python 在北京開。C++在上海開。
3、課程包含。周期、價格。通過學校創建課程。
4、通過學校創建班級。班級關聯課程、講師
5、創建學員時,選擇學校。關聯班級
6、創建講師角色時要選擇學校
7、提供角色接口
7、1 學員視圖,可以註冊。交學費。選擇班級
7、2 講師視圖。講師可以管理自己的班級。上課選擇班級。查看班級學員列表。修改所管理學員的成績
7/3 管理視圖。創建講師、創建班級、創建課程
7/4上面所有操作通過pickel序列化保存到文件。
python 面向對象介紹