Python关于继承以及构造方法上的问题。
最近在研究关于torch中的卷积神经网络结构代码。发现建立卷积神经网络的一些基本的模块调用过程中还有些不明白的地方。在查看了相关资料后明白了其中的原理。
因此写下一篇博客记录自己的收获。
首先我们都知道类的继承格式如下
class Father:
a="这是父类"
class Son(Father):
pass
s=Son() #实例化子类
print(s.a)
仅仅需要声明就可以了。声明后在实例化子类后,子类也具有和父类相同的属性
但是在构造函数的定义上却有些研究。
我们都知道,子类继承父类的时候,如果父类自定义了构造函数,那么子类也会相应的继承其构造函数。当然,如果想自定义构造函数的时候,我们只需要在子类中定义构造函数就可以覆盖父类的构造函数了。
但是有时候我们不想单纯的覆盖父类的构造函数,而是想在其原有的功能上增加一些新的功能,那么这个时候就要引出“重构”的概念了。
下面就是使用重构和不使用重构的代码对比
以下是不使用重构方法
#不使用重构的方法,需要重新编写first_name和last_name这两个参数,很麻烦
class Father:
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
class Son(Father):
def __init__(self,first_name,last_name, age):
self.first_name=first_name
self.last_name=last_name
self.age=age
以下是使用重构方法
#使用重构的方法,可以看到使用super后可以省略first_name和last_name这两个变量的定义过程
class Father:
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
class Son(Father):
def __init__(self,first_name,last_name, age):
super(Son,self).__init__(first_name,last_name)
self.age=age
当然,也可以使用非super的方法重构
class Father:
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
class Son(Father):
def __init__(self,first_name,last_name, age):
Father.__init__(self,first_name,last_name)
self.age=age
当然,Python 3中的super()函数已经默认获取了当前类(即self)和当前方法的信息,因此直接使用如下格式也是可行的(更加常见的)
class Father:
def __init__(self,first_name,last_name):
self.first_name=first_name
self.last_name=last_name
class Son(Father):
def __init__(self,first_name,last_name, age):
super().__init__(first_name,last_name)
self.age=age
总结:可以看到使用重构方法在类的构造上更加的方便,在类属性比较多的时候有优势。