如何继承类bu还添加了一个新的属性在新的

2024-04-30 06:30:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我如何继承下面的类,但我也想在新类中有一个新的属性,同时在这个类中有一个现有的属性

class Data:
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gendre=gender
        print('Done by Data')
    def Name(self):
        return 'My name is '+self.name

这是一个新类,我想在其中继承数据,但问题是,我不能初始化像name,age这样的旧属性在这个类的实例中

class FemData(Data):
    def __init__(self,Married):
        Data.__init__(self)
        self.Married=Married

所以我希望这样的事情发生

DataEntry=FemData('Mia',18,'female',True)

顺便说一句,结婚是件好事


Tags: nameselfagedata属性initdefgender
2条回答

在这里,基类构造函数需要3个参数,而派生类需要一个参数(self除外)。请记住,基构造函数所需的参数需要由派生类构造函数隐式传递

所以派生类构造函数应该接受这个参数,然后将它们传递给基类构造函数。尝试修改派生类数据,如下所示:

class FemData(Data):
    def __init__(self, name, age, gender, married):
        Data.__init__(self, name, age, gender)
        self.married = married

现在,在创建FemData类型的对象时,请记住必须传递name、age、gender和married这四个值

一般建议:使用super,并始终遵循使用super的规则:

  1. 只有向要重写的方法添加参数
  2. 也可以接受任意关键字参数,以便 你不认识的人会被抛弃
  3. 不要传递添加到方法中的参数;无上游 打电话会知道怎么处理他们
  4. 调用函数时使用关键字参数

把这些付诸实践

class Data:
    def __init__(self, name, age, gender, **kwargs):
        # name, age, and gender are "handled" here, so
        # don't pass them on
        super().__init__(**kwargs)
        self.name = name
        self.age = age
        self.gendre = gender

    def Name(self):
        return 'My name is '+self.name


class FemData(Data):
   def __init__(self, married, **kwargs):
       # married is "handled" here, so don't pass them on
       super().__init__(**kwargs)
       self.married = married

# In this example, the MRO for FemData is [FemData, Data, object].
# FemData.__init__ handles married and passes on name, age, and gender
# Data.__init__ handles name, age, and gender and passes on nothing
# object.__init__ receives no arguments, and so does not raise an exception.
DataEntry = FemData(name='Mia', age=18, gender='female', married=True)

尽管FemData似乎暗示性别应该是女性,所以您在对super().__init__的调用中硬编码,忽略/重写任何显式参数

class FemData(Data):
   def __init__(self, married, **kwargs):
       kwargs['gender'] = 'female'
       super().__init__(**kwargs)
       self.married = married


DataEntry = FemData(name='Mia', age=18, married=True)

相关问题 更多 >