同时继承两个父类的结果是什么?
调用同名方法时优先继承哪一个呢?
# 1.多重继承
class A:
def test(self):
print("--->A")
class B:
def test(self):
print("--->B")
class C(A, B): # 同时继承A和B
def test(self):
print("--->C")
c = C()
c.test() # --->C
当有同名方法时,python的探索模式是新式类的广度优先优先搜索自己类中有没有此方法 ->C->A->B
下面还有一例可以深刻感受广度优先:
class Base:
def test(self):
print("---base---")
class A(Base):
def test(self):
print("---A---")
class B(Base):
def test(self):
print("---B---")
class C(Base):
def test(self):
print("---C---")
class D(A, B, C): # 套娃 D继承了A,B,C,A,B,C又继承了Base
pass
# 搜索顺序:D-->A-->B-->C-->Base
# Python3用的是新式类:广度优先
d = D()
d.test() # ---A---
由于classmethod和staticmethod我不知道具体用途是什么,暂时不写
魔术方法
__call__方法:__call__()方法的作用其实是把一个类的实例化对象变成了可调用对象。
class test:
def __init__(self ):
print("__init__")
def __call__(self, name, **kwargs):
print("__call__")
print("你的名字是{}".format(name)) # name接收传来的yft
a = test() # 此时的a相当于对象
a("yft") # 将对象当做是函数调用,此时打印出__call__中的内容
# 如果没有__call__方法,12行会报错,因为a不是可调用对象,而是一个实例。
__str__方法:
触发时机:当打印对象名是自动触发调用__str__里的内容
注意:一定要在__str__方法中加return,里面是打印时看到的内容。
class test:
def __init__(self, name):
self.name = name
def __str__(self):
return "姓名是:" + self.name
t = test("yft")
print(t) # 直接打印p(对象名)会出现地址,使用__str__方法就可以
# 出现想要的信息量,也不用调用方法__str__()