python子类实例调用父类方法_Python实现子类调用父类的方法

python和别的面向对象编程語言相近,每一个类能够有着一个或是好几个父类,他们从父类那边承继了特性和方式。假如一个方式在子类的案例中被启用,或是一个特性在子类的案例中被浏览,可是该方式或特性在子类中并不会有,那麼便会全自动的去父亲类中开展搜索。

承继父类后,就能启用父类方法和浏览父类特性,而要进行全部集成化全过程,子类是必须启用的构造方法的。

子类不显式启用父类的构造方法,而父类构造方法复位了一些特性,便会出現难题

假如子类和父类都是有构造方法,子类实际上是调用了父类的构造方法,如果不显式启用父类构造方法,父类的构造方法就不容易强制执行,造成 子类案例浏览父类复位方式中原始的自变量便会出現难题。

先讨论一下以下实例:

编码以下:class A:

def __init__(self):

self.namea=”aaa”

def funca(self):

print “function a : %s”%self.namea

class B(A):

def __init__(self):

self.nameb=”bbb”

def funcb(self):

print “function b : %s”%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

运作結果:

编码以下:bbb

function b : bbb

Traceback (most recent call last):

File “D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py”, line 19, in module

print b.funca()

File “D:workbenchpythonMyPythonProjectteststudyoverwrite_method.py”, line 6, in funca

print “function a : %s”%self.namea

AttributeError: B instance has no attribute ‘namea’

在子类中,构造方法被调用,但新的构造方法沒有一切有关复位父类的namea特性的编码,为了更好地做到预估的实际效果,子类的构造方法务必启用父亲类的构造方法来开展基础的复位。有二种方式能做到这一目地:启用超类构造方法的未关联版本号,或是应用super涵数。

方式一:启用未关联的超类构造方法

改动编码,多增一行:

编码以下:class A:

def __init__(self):

self.namea=”aaa”

def funca(self):

print “function a : %s”%self.namea

class B(A):

def __init__(self):

#这一行解决了难题

A.__init__(self)

self.nameb=”bbb”

def funcb(self):

print “function b : %s”%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

如上面有注解的一行解决了该难题,立即应用父类名字启用其构造方法就可以。

这类方式称为启用父类的未关联的构造方法。在启用一个案例的方式时,该方式的self主要参数会被全自动关联到案例上(称之为关联方式)。但假如立即启用类的方式(例如A.__init),那麼就沒有案例会被关联。那样就可以随意的出示必须的self主要参数,这类方式称之为未关联unbound方式。

根据将当今的案例做为self主要参数出示给未关联方式,B类就能应用父亲类构造方法的全部完成,进而namea自变量被设定。

方式二:应用super涵数

改动编码,此次必须提升在原先编码上提升2行:

编码以下:#父类必须承继object目标

class A(object):

def __init__(self):

self.namea=”aaa”

def funca(self):

print “function a : %s”%self.namea

class B(A):

def __init__(self):

#这一行解决困难

super(B,self).__init__()

self.nameb=”bbb”

def funcb(self):

print “function b : %s”%self.nameb

b=B()

print b.nameb

b.funcb()

b.funca()

如上面有注解的为增加的编码,在其中第一句让类A承继自object类,那样才可以应用super涵数,由于它是python的“新型类”适用的特点。当今的雷和目标能够做为super涵数的主要参数应用,调用函数回到的目标的一切方式全是启用超类的方式,而不是当今类的方式。

super涵数会回到一个super目标,这一目标承担开展方式分析,分析全过程其会全自动搜索全部的父类及其父类的父类。

方式一更形象化,方式二能够一次复位全部超类

super涵数比在超累中立即启用未关联方式更形象化,可是其较大 的有点儿是假如子类承继了好几个父类,它只必须应用一次super涵数就可以。殊不知要是没有这一要求,立即应用A.__init__(self)更形象化一些。文章内容来源于:www.seo-7.comhttp://www.seo-6.com/seoyh/seojichurm/117856.html

(黑客微信:37009930)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值