子类与父类:子类除了继承父类的所有方法与属性还可以进行派生与改写
派生:子类添加自己的方法与变量
方法的重写:子类继承到父类的方法不能满足子类的需求,子类可以重写从父类继承到的方法。有两种方式:1、完全重写,2、部分重写
1、完全重写: 完全重新将父类的方法进行的全新的定义/实现(根本就没有保留父类方法的原始功能)
class Father():
@classmethod
def class_fun(cls):
pass
@staticmethod
def class_static():
pass
def __init__(self):
pass
def hobby(self):
print("我会唱歌也会跳舞")
pass
class Son(Father):
def hobby(self):
Father.hobby(self)
super().hobby()
print("我不会唱歌但是我会游泳和跳舞")
pass
son = Son()
son.hobby()
通过super().方法名()实现,在原有的父类方法的基础上,增加方法内容。这是部分重写,一般部分重写偏多
而全部重写,将super().方法名()删除就好
多继承:一个子类可以继承多个父类的方法与参数,但是遇到两个父类的方法或者参数一致,根据优先原则,子类会继承相同参数或者方法下的写在最前面的父类的参数和方法
class Father():
@classmethod
def class_fun(cls):
pass
def __init__(self):
pass
def love(self):
print("我是son的爸爸,我喜欢刷抖音")
class Mother():
@classmethod
def class_mother(cls):
pass
def __init__(self):
pass
def love(self):
print("我是son的妈妈,我喜欢刷快手")
class Son(Father,Mother):
pass
son = Son()
son.love()
结果如下:son继承的使father的love不是mother的love
我是son的爸爸,我喜欢刷抖音
Process finished with exit code 0
已经说过一个子类可以继承多个父类的方法和参数,那么子类的子类也可以继承父类的父类的参数和方法,进行多重继承
如:
class Father():
@classmethod
def class_fun(cls):
pass
def __init__(self):
pass
def love(self):
print("我是son的爸爸,我喜欢刷抖音")
class Mother():
@classmethod
def class_mother(cls):
pass
def __init__(self):
pass
def love(self):
print("我是son的妈妈,我喜欢刷快手")
class Son(Father,Mother):
pass
son = Son()
son.love()
class Grandson(Son):
pass
grandson = Grandson()
grandson.love()
输出结果:
D:/************************/面向对象之多继承.py
我是son的爸爸,我喜欢刷抖音
我是son的爸爸,我喜欢刷抖音
Process finished with exit code 0
额外知识:isinstance(参数,某类型),用来判断参数是否属于某类型,如果属于有返回true否则返回false
n = isinstance(1,int)
m = isinstance(son,Mother)
o = isinstance(son,Grandson)
print(n,m,o)
结果:
True True False
Process finished with exit code 0
由此可以得出:子类对象的type属于父类的type,而父类的对象不属于子类的type。
补充:关于子类父类方法中的self,cls是一个绝对指向还是一个相对指向?二者都是一个相对的值,指向当前的类
代码如下:
class Father():
def get_xxx(self):
print(self)
class Son(Father):
pass
class Grandson(Son):
pass
father = Father()
father.get_xxx()
son = Son()
son.get_xxx()
grandson = Grandson()
grandson.get_xxx()
结果如下:
D:\*****************************************\面向对象之多继承2.py
<__main__.Father object at 0x00000246A98AB610>
<__main__.Son object at 0x00000246A62CAA40>
<__main__.Grandson object at 0x00000246A62CAA70>
Process finished with exit code 0