继承:
A类继承B类,A即可获得B类的全部公共属性和方法。格式如:class A(B):
class Animal:
def sleep(self):
print("zZZ...")
def eat(self):
print("yamiyami...")
def run(self):
print("huchihuchi...")
class Dog(Animal): #Dog类拥有sleep,eat,run,bark四个方法
def bark(self):
print("汪汪汪")
方法重写
子类有时需要对继承自父类的方法进行修改或重写,这时直接定义一个与需要重写的方法名一样的方法即可,如(接上面的代码):
class XiaoTianQuan(Dog): def fly(self): print("我在飞") #重写继承自父类的bark()方法 def bark(self): print("我在叫!我在叫!")
父类方法扩展
有时仅需对父类方法进行扩展无需完全重写,只需在重写方法时加上 super().父类方法 即可:
class XiaoTianQuan(Dog):
#扩展继承自父类的bark()方法
def bark(self):
#继承父类的方法
super().bark() #此时super()即代表父类(此时的父类为Dog)
#需要拓展的代码
print("我在叫!我在叫!")
super类是一个特殊的类,super()代表着一个super类的实例
另外关于子类继承父类时super().__init__()的问题的一些理解:
super().__init__()中的super()与上述super()一样代表父类,super().__init__()语句也就是调用父类中的__init__()函数来初始话父类属性。
若子类中无__init__()函数父类有__init__()函数,则创建子类实例时需要按照父类__init__()函数传入实参,子类将自动继承父类属性,子类继承父类全部方法,例子如下:
class Animal:
def __init__(self, number):
self.number = number # 随意写的
def sleep(self):
print("zZZ...")
print(str(self.number)) # 随意写的
def eat(self):
print("yamiyami...")
def run(self):
print("huchihuchi...")
class Dog(Animal): # Dog类拥有sleep,eat,run,bark四个方法
# def __init__(self, number):
# super().__init__(number)
# self.years = 20
def bark(self):
print("汪汪汪")
xiao_huang = Dog(9) # 实例化
xiao_huang.sleep()
print('xiao_huang.number'.center(100, '-'))
print(xiao_huang.number)
输出如下:
若子类中有__init__()函数,父类中有__init__()函数,且子类不写super().__init__()方法,则创建子类实例时需要按照子类__init__()函数传入实参,由于父类属性没有经过super().__init__()方法初始化,则子类将无法继承父类属性,但则仍然继承父类所有方法,例子如下:
class Animal:
def __init__(self, number):
self.number = number
def sleep(self):
print("zZZ...")
print(str(self.number))
def eat(self):
print("yamiyami...")
def run(self):
print("huchihuchi...")
class Dog(Animal): # Dog类拥有sleep,eat,run,bark四个方法
def __init__(self, years):
# super().__init__(number)
self.years = years
def bark(self):
print("汪汪汪")
def year(self):
print(str(self.years))
xiao_huang = Dog(20) # 实例化,注意20为years的实参值
print('xiao_huang.number'.center(100, '-'))
print(xiao_huang.number)
print(xiao_huang.years)
输出如下:
提示子类Dog()没有number这一属性 .
若使用super().__init__()则子类继承父类属性,且继承父类所有方法,此时子类的__init__()函数中需要保护初始化父类属性所有形参,以传入super().__init__()来初始化父类属性,例子如下:
class Animal:
def __init__(self, number):
self.number = number
def sleep(self):
print("zZZ...")
print(str(self.number))
def eat(self):
print("yamiyami...")
def run(self):
print("huchihuchi...")
class Dog(Animal): # Dog类拥有sleep,eat,run,bark四个方法
def __init__(self, years, number):
super().__init__(number)
self.years = years
def bark(self):
print("汪汪汪")
def year(self):
print(str(self.years))
xiao_huang = Dog(20, 9) # 实例化,注意20,9分别是years和number的实参
xiao_huang.sleep()
print('xiao_huang.number'.center(100, '-'))
print(xiao_huang.number)
print(xiao_huang.years)
输出如下:
本文章前半部分引用自 Python的继承、方法重写、super()类