python类的实例化,继承以及多态

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaomifanhxx/article/details/81747113

1 Python类的继承

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

class add_base():
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def sum(self,c):
        return self.a+self.b+c
class add_sub(add_base):
    def sum(self,m,n):
        return self.a+self.b+m-n
b=add_sub(1,3)
summary=b.sum(1,2)
print(summary)    

而我们编写 add_sub 类,完全可以继承 add_base 类(add_sub 就是 add_base);使用 class add_sub(add_base):来表示继承;

继承有什么好处?最大的好处是子类获得了父类的全部属性及功能。如下 add_sub类就可以直接使用父类的 add_base 方法

实例化add_sub的时候,子类继承了父类的构造函数,就需要提供父类要求的两个属性变量:

在继承关系中,如果一个实例的数据类型是某个子类,那它也可以被看做是父类(add_sub既是 子类 又是 父类)。但是,反过来就不行(add_base 仅是 父类,而不是子类)。

继承还可以一级一级地继承下来,就好比从爷爷到爸爸、再到儿子这样的关系。而任何类,最终都可以追溯到根类object,这些继承关系看上去就像一颗倒着的树。比如如下的继承树:

2 类的多态

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

多态的好处就是,当我们需要传入更多的子类,例如新增 Teenagers、Grownups 等时,我们只需要继承父类的类型就可以了,而函数方法既可以直不重写(即使用Person的),也可以重写一个特有的。这就是多态的意思。调用方只管调用,不管细节,而当我们新增一种子类时,只要确保新方法编写正确,而不用管原来的代码。这就是著名的“开闭”原则:

  •     对扩展开放(Open for extension):允许子类重写方法函数
  •     对修改封闭(Closed for modification):不重写,直接继承父类方法函数

请看上面代码:我们修改了sum函数方法,最终我们采用了子类的方法,将父类进行覆盖

3 子类从新写构造函数

class add_base():
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def sum(self,c):
        return self.a+self.b+c
class add_sub(add_base):
    def __init__(self,a,b,k):
        self.a=a
        self.b=b
        self.k=k
    def sum(self,m,n):
        return self.a+self.b+m-n+self.k
b=add_sub(1,2,3)
summary=b.sum(1,2)
print(summary)    

也可以这样写:

class add_base():
    def __init__(self,a,b):
        self.a=a
        self.b=b
    def sum(self,c):
        return self.a+self.b+c
class add_sub(add_base):
    def __init__(self,a,b,k):
        add_base.__init__(self,a,b)
        self.k=k
    def sum(self,m,n):
        return self.a+self.b+m-n+self.k
b=add_sub(1,2,3)
summary=b.sum(1,2)
print(summary)    

参考博客:https://www.cnblogs.com/feeland/p/4419121.html

猜你喜欢

转载自blog.csdn.net/xiaomifanhxx/article/details/81747113