1》面向對象編程(Object-Oriented Programming): 對於編程語言的初學者而言,OOP不是一個很容易理解的編程方式,OPP的三大特性有繼承,封裝,多態,OOP也使得我們對代碼的修改和擴展變得更容易; 封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或對 ...
1》面向對象編程(Object-Oriented Programming):
對於編程語言的初學者而言,OOP不是一個很容易理解的編程方式,OPP的三大特性有繼承,封裝,多態,OOP也使得我們對代碼的修改和擴展變得更容易;
封裝:把客觀事物封裝成抽象的類,並且類可以把自己的數據和方法只讓可信的類或對象操作,對不可信的進行信息隱藏;
繼承:可以使用現有類的所有功能,併在無須重新編寫原來的類的情況下對這些功能進行擴展;一般情況下,一個子類只能有一個基類,要實現多重繼承, 可以通過多級繼承來實現;繼承概念的實現方式有三類:實現繼承,介面繼承和可視繼承;
實現繼承:使用基類的屬性和方法而無需額外編碼的能力;
介面繼承:僅使用屬性和方法的名稱,但是子類必須提供實現的能力;
可視繼承:子類使用基類的外觀和實現代碼的能力;
OOP開發範式大致為: 劃分對象->抽象類->將類組織成為層次化結構(繼承和合成)->用類與實例進行設計和實現;
多態:允許將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運行;簡單的 說,允許將子類類型的指針賦值給父類類型的指針;
封裝和繼承是為了代碼重用,而多態則是為了介面重用;
把一個抽象的類變成一個具體的對象的過程叫實例化;
1>類和構造方法:
2>類的變數與實例變數:
3>類的繼承:
class SchoolMember(object):
membur_nums = 0
def __init__(self,name,age,sex):
self.name = name
self.age = age
self.sex = sex
self.enroll()
def enroll(self):
SchoolMember.membur_nums +=1
# print("\033[32:1m The [%s] memburs SchoolMember [%s] is enrolled!\033[0m" %(self.membur_nums,self.name))
print("The [%s] memburs SchoolMember [%s] is enrolled!" % (self.membur_nums, self.name))
def tell(self):
print("Hello my name is %s" %self.name)
class Teacher(SchoolMember):
def __init__(self,name,age,sex,course,salary):
super(Teacher,self).__init__(name,age,sex)
self.course = course
self.salary = salary
def teaching(self):
print("Teacher [%s] is teaching [%s]" %(self.name,self.course))
class Student(SchoolMember):
def __init__(self,name,age,sex,course,tuition):
super(Student,self).__init__(name,age,sex)
self.course = course
self.tuition = tuition
def pay_tuition(self):
print("cao,student [%s] paying tuition [%s]" %(self.name,self.tuition))
t1 = Teacher("Alex",22,'F',"PY",1000)
t2 = Teacher("Tenglan",25,'N/A',"PY",900)
s1 = Student("SanJiang",24,"Female","python",15000)
s2 = Student("BaoAn",23,"F","python",5000)
t1.tell()
t1.teaching()
s1.tell()
s1.pay_tuition()
4>類的靜態方法類方法及屬性:
****python不支持多態並且也用不到多態,多態用於java和c#中;
多態的應用:
類的成員可以分為三大類:欄位,方法和屬性;
1)欄位:欄位包括普通欄位和靜態欄位,他們在定義和使用中有所區別,而最本質的區別是記憶體中保存的位置不同,普通欄位屬於對象,靜態 欄位屬於類,普通欄位需要通過對象來訪問,靜態欄位通過類訪問;
靜態欄位在記憶體中只保存一份,普通欄位在每個對象中都要保存一份;
靜態欄位===類變數,普通欄位====實例變數;
2)屬性(類方法):其中的裝飾器將方法變為類方法,只能通過類來調用,實例不可以直接調用;
屬性的基本使用:
類的靜態方法:不能訪問類變數,也不能訪問實例變數;
類的屬性,將方法變為屬性:
給屬性設置值:
刪除屬性的設置值:
4>新式類和經典類:
1)多繼承:新式類用廣度優先查找,經典類用深度優先查找(3.0中都是廣度優先);
2)類的描述信息:__doc__;
3)類中實例銷毀:__del__(析構函數),一直將程式執行完之後會執行實例銷毀;
4)__dict__ 以字典形式遍歷出類下的所有變數;
5>反射的妙用:
import sys
class WebServer(object):
def __init__(self,host,port):
self.host = host
self.port = port
def start(self):
print("Server is starting...")
def stop(self):
print("Server is stopping...")
def restart(self):
self.stop()
self.start()
def test_run(self,name):
print("running...",name,self.host)
if __name__ =="__main__":
server = WebServer('localhost',333)
#print(sys.argv[1])
if hasattr(server,sys.argv[1]):
func = getattr(server,sys.argv[1]) #獲取server.start記憶體地址
func() #server.start()
# setattr(server,"run",test_run) #類的實例,屬性,方法名
# server.run(server,"che")
# delattr(server,"host") #刪除實例中的對象
# print(server.host)
delattr(WebServer,"start") #刪除類中的方法
print(server.restart())
# cmd_dic = {
# "start":server.start,
# "stop":server.stop,
# "restart":server.restart,
# }
#if sys.argv[1] == "start":
# if sys.argv[1] in cmd_dic:
# cmd_dic[sys.argv[1]]()