Python的super函数解读

Python的子类会继承父类的类属性和类方法,包括构造方法。并且,当一个子类继承多个父类的构造方法的时候,会优先选择排在最前面的父类中的实例方法。

举例

class People:
    def __init__(self,name):
        self.name = name
    def say(self):
        print("我是人,名字为:",self.name)

class Animal:
    def __init__(self,food):
        self.food = food
    def display(self):
        print("我是动物,我吃",self.food)
#People中的 name 属性和 say() 会遮蔽 Animal 类中的
class Person(People, Animal):
    pass

per = Person("zhangsan")
per.say()
#per.display()

运行结果
我是人,名字为:zhangsan

但是如果想执行per.display()
就会报错
File “super_demo.py”, line 20, in display
print(“我是动物,我吃”, self.food)
AttributeError: ‘Person’ object has no attribute ‘food’。
原因是:Person首先继承的是People的构造方法,并没有继承Animal的构造方法,所以在执行
print(“我是动物,我吃”,self.food)的过程中,显示找不到self.food这个属性。
反之,class Person(People, Animal) 如果改成 class Person( Animal, People),那么per.say()就会报错。

如果想避免上面的问题,就需要自定义Person的构造方法。
这个构造方法有几个方式,在下面例子中可见

class Person(People, Animal):
    #自定义构造方法
    def __init__(self,name,food):
        #调用 People 类的构造方法
        super().__init__(name) #默认执行第一个父类People的构造函数
        #super(Person,self).__init__(name) #执行效果和上一行相同
        #People.__init__(self,name)#使用未绑定方法调用People 类构造方法,执行效果和上一行相同
        #调用其它父类的构造方法,需手动给 self 传值
        Animal.__init__(self,food)    
per = Person("zhangsan","土豆")
per.say()
per.display()

运行结果
我是人,名字为:zhangsan
我是动物,我吃 熟食

回到本文开头

Abcnet(nn.Module):
	def __init__(self, in_channels, out_channels, xxxx xxxx):
		super().__init__() 
		#super(nn.Module).__init__() #等同于上一行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值