面向对象的三大特性之二(1)-继承(多重继承)-多态
一、多继承:Java或c#不支持多继承,即一个子类继承多个父类
但是c++和python支持
1.多继承调用父类方法优先级(默认情况左侧优先,并且一条路找到尽头)
第一种情况:
class F1():
def a(self):
print("F1.a")
class F2:
def a(self):
print("F2.a")
class S(F1,F2):
pass
ret = S()
ret.a()#有先找函数a(),找到的第一个为输出
第二种情况:单线寻找,找到尾端后若没有方法就去分支父集找
class F0:
def a(self):
print("F0.a")
class F1(F0):
def al(self):
print("F1.a")
class F2:
def a(self):
print("F2.a")
class S(F1,F2):#当F1没有函数时就沿着F1父类继续找
pass
ret = S()
ret.a()
第三种情况父集继承出现交叉(如果有共同父集出现,只找到公共父集之前,然后去其它分支查找,若都没有才去公共父集查找)
class Bass:
def a(self):
print("Bass")
class F0(Bass):
def al(self):
print("F0.a")
class F1(F0):
def al(self):
print("F1.a")
class F2(Bass):
def a(self):
print("F2.a")
class S(F1,F2):#当F1没有函数时就沿着F1父类继续找
pass
ret = S()
ret.a()
2.代码执行流程。(self到底是谁的对象)
例1:(特殊提示)
class BaseRequest:
pass
class RequestHandler(BaseRequest):
def serve_forever(self):
print("RequestHandler.serve_forever")
self.process_request()#此时的self指的是Son,所以不会执行本类的方法,依顺序头衔从到开始找到Minx类中的方法
def process_request(self):
print("RequestHandler.process_request")
class Minx:
def process_request(self):
print("Minx.process_request")
class Son(Minx,RequestHandler):
pass
obj = Son()
obj.serve_forever()
例2:(特殊提示:构造函数)
class BaseRequest:
def __init__(self):
print("RequestHandler.init-2")
class RequestHandler(BaseRequest):
def __init__(self):
print("RequestHandler.init-1")
BaseRequest.__init__(self)
def serve_forever(self):
print("RequestHandler.serve_forever")
self.process_request()#此时的self指的是Son,所以不会执行本类的方法,依顺序头衔从到开始找到Minx类中的方法
def process_request(self):
print("RequestHandler.process_request")
class Minx:
def process_request(self):
print("Minx.process_request")
class Son(Minx,RequestHandler):
pass
obj = Son() #init
obj.serve_forever()
解释socketserver源码执行关系
import socketserver
obj = socketserver.ThreadingTCPServer()#创建对象,找init(构造函数,找到init之后给构造函数传参数)
obj.serve_forever()
二、多态:python里面原生多态
面向对象的三大特性之二(2)-继承(多重继承)-多态
最新推荐文章于 2023-02-16 14:11:38 发布