python的继承问题

**super(子类,self).init(形参1,形参2)**没有多么高级的意思,要把这句代码分开理解,**super(子类,self)这句只是引出父类的意思,.init(形参1,形参2)**这个只是调用父类的构造函数,如果用不到父类构造函数内的东西,完全可以不调用,其它方法也是,需要父类方法,调用即可,格式也是如此。
调用构造函数(专有方法)有两种写法:
1.super(子类,self).init(形参1,形参2)
2.父类.init(形参1,形参2)
调用父类一般方法也有两种方法(这里假设一般方法为speak()):
1.super(子类,self).speak()
2.父类.speak(self)
注意:这里的self需要注意,如果在方法内调用父类一般方法,就写self就行,如果在类外部调用父类一般方法,就需要把self换成实例化的对象。
这里有三种情况
第一种子类,父类都没有构造函数情况,如下所示,直接用super(子类,self)函数,就可以调用父类方法了

class Parent:        # 定义父类
   def myMethod(self):
      print ('调用父类方法')
 
class Child(Parent): # 定义子类
   def myMethod(self):
      print ('调用子类方法')
 
c = Child()          # 子类实例
c.myMethod()         # 子类调用重写方法
super(Child,c).myMethod() #用子类对象调用父类已被覆盖的方法

第二种是父类有构造函数,子类没有构造函数,子类在实例化时会自动调用父类的构造函数
第三种是父类有构造函数,子类也有构造函数,子类在实例化时就不会调用父类的构造函数
这两种情况详见:https://www.runoob.com/w3cnote/python-extends-init.html

第三种的复杂情况,见如下:
子类的一般方法内使用父类的变量

class fa():
    def __init__(self,a,b):
        self.name=a
        self.local=b
    def speak(self):
        print('my name is:',self.name,"my location is:",self.local)
class son(fa):
    def __init__(self,a,b,d):
        fa.__init__(self,a,b)#调用父类的构造方法,否则子类speak()方法的变量会被提示无定义,因为调用的是父类的变量
        #super(son,self).__init__(a,b) 与上一句等同
        #super(son, self).speak()这一句只要在继承父类的构造函数下的方法内或者其它方法内都行,不能独立于方法
        self.action=d
    def speak(self):
        super(son, self).speak()#调用父类的一般方法
        print('my name is:', self.name, "my location is:", self.local,
              'my location is:',self.action)
ls=son('jk','bbn','io')
ls.speak()
super(son,ls).speak()#调用父类的一般方法

执行结果:

D:\python\python.exe F:/code/d.py
my name is: jk my location is: bbn
my name is: jk my location is: bbn my location is: io
my name is: jk my location is: bbn

进程已结束,退出代码 0

子类的一般方法内使用自己的变量,不使用父类变量

class fa():
    def __init__(self,a,b):
        self.name=a
        self.local=b
    def speak(self):
        print('my name is:',self.name,"my location is:",self.local)
class son(fa):
    def __init__(self,a,b,d):
        self.a=a
        self.b=b
        # fa.__init__(self,a,b)
        # super(son,self).__init__(a,b)
        # super(son, self).speak()
        self.action=d
    def speak(self):
        print('my name is:', self.a, "my location is:", self.b,
              'my location is:',self.action)
ls=son('jk','bbn','io')
ls.speak()
#super(son,ls).speak()

执行结果:

D:\python\python.exe F:/code/d.py
my name is: jk my location is: bbn
my name is: jk my location is: bbn my location is: io
my name is: jk my location is: bbn

进程已结束,退出代码 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值