注册 登录

清河洛

python中OOP的继承和组合

qingheluo2018-11-20清河洛331
继承在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。继承的好处是子类获得了父类的全部功能,其次是多态。当子类和父类都存在相同的方法时,子类方法会覆盖父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。调用未绑定的父类方法和super()函数class FClass: def __init__(self): self.name=‘MyName‘ class ...

继承

在OOP程序设计中,当我们定义一个class的时候,可以从某个现有的class继承,新的class称为子类(Subclass),而被继承的class称为基类、父类或超类(Base class、Super class)。

继承的好处是子类获得了父类的全部功能,其次是多态。

当子类和父类都存在相同的方法时,子类方法会覆盖父类的方法,在代码运行的时候,总是会调用子类的方法。这样,我们就获得了继承的另一个好处:多态。

调用未绑定的父类方法和super()函数

class FClass:
    def __init__(self):
        self.name=‘MyName‘
class SClass(FClass):
    def __init__(self):
        self.age=28

上例中其实子类仅仅是想新增一个age属性,name属性仍然是需要的,但是这种做法子类的实例中是没有name属性的,有三个办法可以解决这个问题

1.完全重定义__init__方法,在子类中把父类中的定义再重新写一遍,这种做法很麻烦,不推荐

2.调用未绑定的父类方法,在子类的__init__方法语句第一行增加FatherClassName.__init__(self):

class SClass(FClass):
    def __init__(self):
        FClass.__init__(self)
        self.age=28

这个方法如果代码改动如父类改名,则所有子类都要修改父类的名字,很繁琐

3.使用super()函数

class SClass(FClass):
    def __init__(self):
        super().__init__()
        #使用super()不需要传入self参数
        self.age=28

这个方法无论后期父类如何改动,子类都不需要改动任何代码即可执行,推荐此方法

组合

组合是把一些没有继承关系的类放到一起,把类的实例化放到了新类里面,新类就组合了旧类,这样不会产生继承中的覆盖等问题。

class def Yuwen:
    def __init__(self , x):
        self.fen = x 
class def Shuxue:
    def __init__(self , x):
        self.fen = x
class Chengji:
    def __init__(self , x ,y):
        self.yuwen = Yuwen(x)
        self.shuxue = Shuxue(y)
    def print_chengji(self):
        print("语文分数是 %d ,数学分数是 %d" % (self.yuwen.fen , self.shuxue.fen))


网址导航