Python 继承

概述

继承就是复制父类的内容,到子类里面

In [1]: class Animal(object):
   ...:     def __init__(self,name):
   ...:         self.name=name
   ...:     def speak(self):
   ...:         print("animal")
   ...: 
   ...: class Cat(Animal):
   ...:     pass

In [2]: tom=Cat("tom")

In [3]: tom.name
Out[3]: 'tom'

In [4]: tom.speak()
animal

1. 私有方法和属性,不能被子类继承和访问
2. 子类和各个父类中如果有相同方法,优先调用自己,然后向上寻找最近父类(如果父类有平行类,则按继承顺序从左至右继承,可以用__mro__来查看继承顺序)“覆盖”一词用的并不好,并没有“覆盖”掉,只是调用的顺序不同。
3. 调用被重写父类的方法有两种
3.1. super().func()
3.2. name.func(self)
4. 调用父类同名方法的一个应用就是私有方法和属性不会被继承,但可以通过父类中调用私有方法的方法来调用父类的私有方法

class MyDict(dict):
	def __init__(self,*args,**kwargs):
		super(MyDict,self).__init__(*args,**kwargs)
		self['modify'] = True
	
obj = MyDict()
print(obj)

父类的__init__

1.子类的__init__会覆盖父类的__init__导致父类无法初始化

class A:
    def __init__(self):
        A = 'A'
        self.a = 'a'
        print('init A')
        
class B(A):
    def __init__(self):
        self.b = 'b'
        print('init B')

b = B()
print(b.A) # 由于B中的`__ini__()`方法覆盖了父类A中的,所以A没有被初始化
print(b.a)

2.使用父类的__init__来初始化父类

class B(A):
    def __init__(self):
        A.__init__(self) # 在子类中的`__init__`来手动初始化父类,但是写父类的名称还不够智能,可以使用super()来代替
        self.b = 'b'
        print('init B')

b = B()
print(b.A)
print(b.a)

3.最终版,使用super()

class B(A):
    def __init__(self):
        A.__init__(self) # 可以使用super()来代替,而不需要关系父类的名称是什么
        self.b = 'b'
        print('init B')

b = B()
print(b.A)
print(b.a)

参考:
https://www.cnblogs.com/Peter2014/p/10844204.html
super讲解
https://www.runoob.com/python/python-func-super.html

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值