鱼C论坛

 找回密码
 立即注册
查看: 1360|回复: 9

[已解决]关于类的继承问题

[复制链接]
发表于 2018-3-20 19:57:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在网上找了个很相近的问题;

class Person(object):
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender

class Teacher(Person):
    def __init__(self,name,course):
        super(Teacher,self).__init__(name)
        self.course=course

t1=Teacher('zhang','Chinese')

这个是代码,然后进行实例化时,t1 无论传入2个参数还是三个参数都会报错.
2个参数时:TypeError: __init__() missing 1 required positional argument: 'gender'
3个参数时:TypeError: __init__() takes 3 positional arguments but 4 were givens

想知道这是为什么....然后有一些什么具体的规则.....
\主要是想知道,子类不能只继承部分父类规则吗..

最佳答案
2018-3-20 20:46:24
icangothere 发表于 2018-3-20 20:36
也就是说子类没法只继承部分父类的属性是吧....
还有子类传入的参数全部包含父类参数是吧......

也不完全是,父类的init如果有*参,就不那么限制参数个数,但是你只要明白函数的格式还有你怎么输入才算闭包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-20 20:09:19 | 显示全部楼层
2个参数时super的init需要gender你没有传,你传的参数被识别为name和course
传3个又因为你本身的init参数不要那么多

子类可以继承父类部分规则,你只是传参错误
但这里你把name写成和course一样的就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-20 20:15:58 | 显示全部楼层
塔利班 发表于 2018-3-20 20:09
2个参数时super的init需要gender你没有传,你传的参数被识别为name和course
传3个又因为你本身的init参数 ...

也就是说无论如何我都不能实现只从父类(Person)的__init__里面继承self.gender吗...
我把函数改了下:
class Person(object):
    def __init__(self,name,gender):
        self.name=name
        self.gender=gender

class Teacher(Person):
    def __init__(self,name,course):
        super(Teacher,self).__init__(gender)
        self.course=course
        self.name = name

t1=Teacher('zhang','Chinese','asd')

依然报错:TypeError: __init__() takes 3 positional arguments but 4 were given
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 20:19:34 | 显示全部楼层
icangothere 发表于 2018-3-20 20:15
也就是说无论如何我都不能实现只从父类(Person)的__init__里面继承self.gender吗...
我把函数改了下:
c ...

你和没改一样啊
你多传入的参数不会被识别为gender,因为你的init就3个参数,self也算一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-20 20:20:58 | 显示全部楼层
塔利班 发表于 2018-3-20 20:19
你和没改一样啊
你多传入的参数不会被识别为gender,因为你的init就3个参数,self也算一个

那应该怎么改才对呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 20:29:07 | 显示全部楼层
icangothere 发表于 2018-3-20 20:20
那应该怎么改才对呢

首先,你子类要不要gender属性,要的话带入super时把name一起带上
此时你子类init参数要有name,gender,course
如果没有那就不用继承了

我觉得你的父类如果没有比较复杂的初始化函数,
重写赋值就好了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 20:34:23 | 显示全部楼层
  1. class Person(object):
  2.     def __init__(self,name,gender):
  3.         self.name=name
  4.         self.gender=gender

  5. class Teacher(Person):
  6.     def __init__(self,name,course):
  7.         super(Teacher,self).__init__(name,gender)
  8.         self.course=course

  9. t1=Teacher('zhang','Chinese')
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-20 20:36:48 | 显示全部楼层
塔利班 发表于 2018-3-20 20:29
首先,你子类要不要gender属性,要的话带入super时把name一起带上
此时你子类init参数要有name,gender,c ...

也就是说子类没法只继承部分父类的属性是吧....
还有子类传入的参数全部包含父类参数是吧......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-20 20:46:24 | 显示全部楼层    本楼为最佳答案   
icangothere 发表于 2018-3-20 20:36
也就是说子类没法只继承部分父类的属性是吧....
还有子类传入的参数全部包含父类参数是吧......

也不完全是,父类的init如果有*参,就不那么限制参数个数,但是你只要明白函数的格式还有你怎么输入才算闭包
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-20 20:49:17 | 显示全部楼层
塔利班 发表于 2018-3-20 20:46
也不完全是,父类的init如果有*参,就不那么限制参数个数,但是你只要明白函数的格式还有你怎么输入才算 ...

好的,非常感谢~!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 15:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表