继承
一定时刻知道,self是哪个类的对象。只要知道是哪个类的对象,就从哪个类开始进行查找
class base: # 父类,也可称为基类pass
class Info(base): # 子类,也可称为派生类passclass 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类找f1class 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):passobj = ThreadingServer() # obj = ThreadingServer 实例化对象
obj.run_server() # 999# 一定时刻知道,self是哪个类的对象。只要知道是哪个类的对象,就从哪个类开始进行查找