繼承
一定時刻知道,self是哪個類的物件。只要知道是哪個類的物件,就從哪個類開始進行查詢
class base: # 父類,也可稱為基類
pass
class Info(base): # 子類,也可稱為派生類
pass
class base: # 父類,也可稱為基類
def f1(self):
print('f1')
class Info(base): # 子類,也可稱為派生類
def f1(self):
print('f2')
obj = Info()
obj.f2()
obj.f1()
- 案例1
class base: # 父類,也可稱為基類
def f1(self):
print('f1')
class Info(base): # 子類,也可稱為派生類
def f2(self):
print('f2')
obj = base() #由base類建立的物件
obj.f1() # base.f1
obj.f2() # info.f2 報錯,base類不能繼承子類中的方法
obj2 = Info() #由base類建立的物件
obj2.f1() # base.f1
obj2.f2() # info.f2
- 案例2
# 優先從自己裡面查詢,自己裡面,在去父類查詢
class base: # 父類,也可稱為基類
def f1(self):
print('f1')
class Info(base): # 子類,也可稱為派生類
def f2(self):
print('f2')
def f1(self):
print('f1')
obj = base() #由base類建立的物件
obj.f1() # base.f1
obj.f2() # info.f2 報錯,base類不能繼承子類中的方法
obj2 = Info() #由base類建立的物件
obj2.f1() # Info.f1
obj2.f2() # Info.f2
- 案例3
重點,不要診斷self代指的就是當前類,一定要看self是誰?是哪個類建立的物件
class base: # 父類,也可稱為基類
def f1(self):
print('base.f1')
def f2(self):
print('base.f2')
self.f1() # 相當於:obj1.f1 -> 先base類找f1
class Info(base): # 子類,也可稱為派生類
def f2(self):
print('Info.f2')
self.f1()
def f1(self):
print('Info.f1')
obj1 = base() # 由base類建立的物件
obj1.f1() # base.f2 -> base.f1
# obj.f2從base類找:base.f2,發現找到了,找到後開始執行。先輸出base.f2,後。
# 下句執行為self.f1(),此時當我們看到self時,一定想著說這個self是找表的當前的這個類嗎
# 不是,self不是表示當前類,一定要看self是什麼。 self本質上是一個引數,此時看是哪個在呼叫這個f2,分析發現是obj1呼叫的f2,此時我們看obj1是哪個類的物件
# 發現obj1是base 這個類的物件。所以此時的:self.f1() 相當於:obj1.f1() ,而obj1是base這個類中的物件,所以找f1時,先從base類中進行找f1,當前base類中是有f1
# 此時輸出的:base.f1。
obj2 = Info() # 由base類建立的物件
obj2.f2() # Info.f2 -> Info.f2
- 案例4
def handler(self):
self.process()
def process(self):
print(123)
class Mixin:
def process(self):
print(999)
class ThreadingServer(Mixin, Server):
pass
obj = ThreadingServer() # obj = ThreadingServer 例項化物件
obj.run_server() # 999
# 一定時刻知道,self是哪個類的物件。只要知道是哪個類的物件,就從哪個類開始進行查詢