python笔记
python筆記 - day7-1 之面向?qū)ο缶幊?
什么時候用面向?qū)ο螅?/h4>
多個函數(shù)的參數(shù)相同;
當(dāng)某一些函數(shù)具有相同參數(shù)時,可以使用面向?qū)ο蟮姆绞剑瑢?shù)值一次性的封裝到對象,以后去對象中取值即可;
self是什么?
self是一個python自動會給傳值得參數(shù); 哪個對象執(zhí)行方法,self就是哪個對象;例:
class SQLHelper:
def __init__(self,a1,a2,a3):
print("自動執(zhí)行")
self.hhost = a1
self.uusername = a2
self.pwd = a3
def fetch(self,sql):
print(self.hhost)
print(self.uusername)
print(self.pwd)
print(sql)
def create(self,sql):
print(self.hhost)
print(self.uusername)
print(self.pwd)
print(sql)
obj1 = SQLHelper('C1.SALT.COM','alex',123)
obj1.fetch("select * from A")
#如果SQLHelper后面加括號,表示執(zhí)行SQLHelper的__init__方法;
#obj1如果執(zhí)行了__init__方法,self就等于obj1
#如:
def __init__(self,a1,a2,a3):
print("自動執(zhí)行")
obj1.hhost = a1
obj1.uusername = a2
obj1.pwd = a3
obj2 = SQLHelper('www.baidu.com','freddy',123)
obj2.create("create ........")
#obj2如果執(zhí)行了__init__方法,self就等于obj2
#如:
def __init__(self,a1,a2,a3):
print("自動執(zhí)行")
obj2.hhost = a1
obj2.uusername = a2
obj2.pwd = a3
構(gòu)造方法:
類中有一個特殊的方法,__init__,類()自動執(zhí)行; 創(chuàng)建對象,后面加括號,表示遇到__init__方法,就執(zhí)行__init__方法;面向?qū)ο螅筇匦裕骸 ?/h4>
封裝,繼承,多態(tài);
“函數(shù)式編程”,與“面向?qū)ο缶幊獭北容^:
函數(shù)式編程:使用函數(shù)式編程,如果執(zhí)行每個函數(shù),都要重新傳入?yún)?shù),比較麻煩:
def fetch(host,username,password,sql):
pass
def create(host,username,password,sql):
pass
def remove(host,username,pasword,uid):
pass
def modify(host,username,password,name):
pass
面向?qū)ο缶幊蹋嚎梢詣?chuàng)建一個對象,到時候想要執(zhí)行哪個方法,調(diào)用自己創(chuàng)建的對象即可;
class SQLHelper:
def fetch(self,sql): print(self.hhost) print(self.uusername) print(self.pwd) print(sql)
def create(self,sql): pass
def remove(self,uid): pass
def modify(self,name): pass #類里面的方法只能通過對象來調(diào)用 obj = SQLHelper() obj.hhost = "www.mysql.com" obj.uusername = "freddy" obj.pwd = '123' obj.fetch("select * from A")
標(biāo)準面向?qū)ο髮懛ǎ?/h3>
class SQLHelper:
def __init__(self,a1,a2,a3):
print("自動執(zhí)行")
self.hhost = a1
self.uusername = a2
self.pwd = a3
def fetch(self,sql):
print(self.hhost)
print(self.uusername)
print(self.pwd)
print(sql)
def create(self,sql):
print(self.hhost)
print(self.uusername)
print(self.pwd)
print(sql)
#這里會把自定義的三個參數(shù),分別傳給fetch,create;
obj1 = SQLHelper('c1.salt.com','alex',123)
#調(diào)用上面創(chuàng)建的對象,并執(zhí)行額外的命令
obj1.fetch("select * from A")
#調(diào)用這個對象,執(zhí)行額外的命令
obj1.create("create database aaa")
取其它對象下面的值:
class c1:
def __init__(self,name,obj):
self.name = name
self.obj = obj
class c2:
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
print(self.name)
c2_obj = c2('aa',11)
c1_obj = c1("alex",c2_obj)
# - 取出來c2_obj下的age是多少?
# - c2_obj賦值給c1_obj了,先打印c1_obj,
# - c2_obj賦值給c1_obj下的obj了,再打印c1_obj.obj,相當(dāng)于打印的c2_obj
# - 最后再c2_obj里面取出age的值即可
print(c1_obj.obj.age)
類之前的方法調(diào)用,三個類:
class c1:
def __init__(self,name,obj):
self.name = name
self.obj = obj
class c2:
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
print(self.name)
# return 123
class c3:
def __init__(self,a1):
self.money = 123
self.aaa = a1
#如何使用C3類,調(diào)用c2類下的show方法?
c2_obj = c2('freddy',11)
#c2_obj是c2類型
# - name = 'aa'
# - age = 11
c1_obj = c1("alex",c2_obj)
#c1_obj是c1類型
# - name = "alex"
# - obj = c2_obj
c3_obj = c3(c1_obj)
#使用c3_obj找到c2下的name
print(c3_obj.aaa.obj.age)
#使用c3_obj執(zhí)行show方法
ret = c3_obj.aaa.obj.show()
print(ret)
繼承:
class F1:
def show(self):
print('show')
def foo(self):
print(self.name)
class F2(F1):
def __init__(self,name):
self.name = name
def bar(self):
print('bar')
def show(self):
print('F2.show')
#F2類下找不到foo方法,就繼續(xù)去F1下找foo方法,因為F2類繼承了F1類;
#繼承就相當(dāng)于把父類的內(nèi)容,在子類中創(chuàng)建了一份;
#子類可以繼承父類,父類不能繼承子類;
obj = F2('alex')
obj.foo()
#F1和F2類里面都有show方法,這里創(chuàng)建對象是F2的類,優(yōu)先調(diào)用F2類下的show方法
obj = F2('alex')
obj.show()
面向?qū)ο笾畣卫^承:
class S1:
def F1(self):
self.F2()
def F2(self):
pass
class S2(S1):
def F3(self):
self.F1()
def F2(self):
pass
obj = S2()
obj.F3()
#這里執(zhí)行的是S2下的F2
obj = S1()
obj.F1()
#這里執(zhí)行的是S1下的F2
面向?qū)ο笾嗬^承,繼承都是從底層開始找:
def __init__(self,name,obj):
self.name = name
self.obj = obj
class c2:
def __init__(self,name,age):
self.name = name
self.age = age
def show(self):
print(self.name)
# return 123
class c3:
def __init__(self,a1):
self.money = 123
self.aaa = a1
#如何使用C3類,調(diào)用c2類下的show方法?
c2_obj = c2('freddy',11)
#c2_obj是c2類型
# - name = 'aa'
# - age = 11
c1_obj = c1("alex",c2_obj)
#c1_obj是c1類型
# - name = "alex"
# - obj = c2_obj
c3_obj = c3(c1_obj)
#使用c3_obj找到c2下的name
print(c3_obj.aaa.obj.age)
#使用c3_obj執(zhí)行show方法
ret = c3_obj.aaa.obj.show()
print(ret)
方法一:最簡單的多繼承,通過C3繼承了C2,C1,通過C3類,可以執(zhí)行C2,C1里面的方法
class C1:
def f1(self):
print("f1")
class C2:
def f2(self):
print("f2")
class C3(C2,C1):
def f3(self):
print("f3")
obj = C3()
obj.f1()
obj.f2()
obj.f3()
方法二:一條道,走到黑,如果父類只有一個子類,就是先去子類找,找不到再往右找;
查找順序:C3.f2(沒有) → C1.f2(沒有) → C0.f2(有,執(zhí)行),沒有就執(zhí)行C2.f2
class C0:
def f2(self):
print("C0.F2")
class C1(C0):
def f3(self):
print("C1.F3")
class C2:
def f2(self):
print("C2.f2")
class C3(C1,C2):
def f3(self):
print("f3")
obj = C3()
obj.f2()
結(jié)果:C0.F2
方法三:如果一個父類,有兩個子類,執(zhí)行順序:
C3.f2(沒有) → C1.f2(沒有) → C0.f2(沒有,就不往上找了) → C3.f2(回到原點,沒有) → C2.f2(有,執(zhí)行)
class C_2:
def f2(self):
print("C-2,F2")
class C_1(C_2):
def f2(self):
print("C_1.F2")
class C0(C_2):
def f3(self):
print("C0.F2")
class C1(C0):
def f3(self):
print("C1.F3")
class C2(C_1):
def f2(self):
print("C2.f2")
class C3(C1,C2):
def f3(self):
print("f3")
obj = C3()
obj.f2()
看源碼必須要懂這個原理:
執(zhí)行:obj = A()
obj.forever()
A → process() → __init__ 【找到init了,obj = A()執(zhí)行完了,回到原點,開始執(zhí)行obj.forever() 】
A → process() → __init__ → __init__ , run(),process() → forever()【找到了,執(zhí)行這個方法】
執(zhí)行:self.run()
A → process() → __init__ → __init__ , run()【找到了,執(zhí)行這個方法】
執(zhí)行:self.process()
A → process(),【找到了,執(zhí)行這個方法】
這個模塊源碼,就是引用了上面的方法:
import socketserver #加括號,是個函數(shù)執(zhí)行這個函數(shù), # 是個類,執(zhí)行init方法 obj = socketserver.ThreadingTCPServer() obj.serve_forever()
總結(jié)
- 上一篇: 初五拜年有什么讲究?
- 下一篇: Linux磁盘挂载(亲测)