派生类的python构造函数

时间:2011-11-15 09:57:21

标签: python derived-class super base-class

class baseClass():
  def __init__(self,mark,name):
    self.mark = mark
    self.name = name

class derivedClass(baseClass):

b1 = derivedClass(name='Jibin')
print b1.name

这是我最初的代码&它运作良好。

(注意:我无权访问baseClass

但后来我不得不将另一个属性rank传递给derivedClass。所以我编辑了这样的代码。

class baseClass():
  def __init__(self,mark,name):
    self.mark = mark
    self.name = name

class derivedClass(baseClass):
  def __init__(self,rank):
    self.rank = rank 

b1 = derivedClass(name='Jibin')
print b1.name

这导致错误__init__() got an unexpected keyword argument 'name'

这是预期的,因为__init__的{​​{1}}没有参数derivedClass

我不想向name name __init__ derivedClass添加额外参数baseClass实际derivedClass中有10个参数而不是2个(标记,名称) )&如果我把它们全部作为baseClass.__init__(self)的附加参数,我将把它的论点列表弄得一团糟。

注意:我知道使用super(derivedClass, self).__init__()或{{1}}初始化baseClass

4 个答案:

答案 0 :(得分:6)

也许你可以试试这样的事情

class BaseClass(object):
  def __init__(self, mark=None, name=None):   # you're using named parameters, declare them as named one.
    self.mark = mark
    self.name = name

class DerivedClass(BaseClass):   # don't forget to declare inheritance
  def __init__(self, rank, *args, **kwargs):    # in args, kwargs, there will be all parameters you don't care, but needed for baseClass
    super(DerivedClass, self).__init__(*args, **kwargs)
    self.rank = rank 

b1 = derivedClass(name='Jibin')
print b1.name

答案 1 :(得分:0)

This blog描述了如何解决这类问题。解决方案是让base以及derived**kwargs中接受__init__参数,并将其传递给super

答案 2 :(得分:0)

derivedClass 实际上源自baseClass。要在python中进行子类化,必须将父类提供给类定义:

class DerivedClass(BaseClass):
    pass

DerivedClass现在继承了BaseClass的方法,包括 __init__()。如果不覆盖方法,则在子类上调用它实际上会调用超类上定义的方法。

因此,如果您想允许DerivedClass(name='Jibin'),则需要提供专门的 init ():

class BaseClass(object):
    def __init__(self, mark, name):
        self.mark = mark
        self.name = name

class DerivedClass(BaseClass):
    def __init__(self, mark, name, rank):
        BaseClass.__init__(self, mark, name)
        self.rank = rank

现在,您还希望支持DerivedClass() 的其他关键字参数,而无需明确添加它们。实现此目的的一种方法是将所有kwargs分配给实例属性,因此:

class BaseClass(object):
    def __init__(self, mark, name, **kwargs):
        self.mark = mark
        self.name = name
        self.__dict__.update(kwargs)

我不建议这样做'真实'。盲目设置属性可能会在未来引入微妙的错误(例如通过传递同名的关键字arg在不知不觉中替换方法)

答案 3 :(得分:0)

你们有没有尝试过 [Python] cast base class to derived class

我测试了它,似乎有效。另外我认为这个方法比下面的方法好一点,因为下面的方法不会执行派生函数的 init 函数。

c.__class__ = CirclePlus