派生类的python构造函数

派生类的python构造函数,python,derived-class,super,base-class,Python,Derived Class,Super,Base Class,这是我最初的代码&它工作得很好 (注意:我无权访问基类) 但是后来我不得不将一个附加属性rank传递给derivedClass,所以我像这样编辑代码 class baseClass(): def __init__(self,mark,name): self.mark = mark self.name = name class derivedClass(baseClass): b1 = derivedClass(name='Jibin') print b1.name 这导

这是我最初的代码&它工作得很好

(注意:我无权访问
基类

但是后来我不得不将一个附加属性
rank
传递给
derivedClass
,所以我像这样编辑代码

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

class derivedClass(baseClass):

b1 = derivedClass(name='Jibin')
print b1.name
这导致了一个错误
\uuuu init\uuuuu()获取了一个意外的关键字参数“name”

这是预期的,因为
derivedClass
\uuuuu init\uuuu
没有参数
名称

我不想在
derivedClass
b'cos的
init
中添加一个额外的参数
name
,因为在real
baseClass
中有十个参数,而不是两个(mark,name)&如果我把它们都作为
derivedClass
的额外参数,我将弄乱它的参数列表


注意:我知道使用
基类初始化基类。
超级(derivedClass,self)。
也许您可以尝试类似的方法

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

描述如何解决此类问题。解决方案是让
base
derived
在它们的
\uuuu init\uuuu
中接受
**kwargs
参数,并将其传递给
super

的调用
derivedClass
实际上不是从
baseClass
派生的。要在python中创建子类,必须为类定义提供父类,因此:

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=None, *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
DerivedClass
现在继承了基类的方法,包括
\uuuu init\uuuu()
。如果不重写某个方法,那么在子类上调用它实际上会调用在超类上定义的方法

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

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

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
不过,我不建议这是真的。盲目地设置属性很可能会在将来引入一些微妙的错误(比如通过传递相同名称的关键字arg来不知不觉地替换方法)

你们试过了吗

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

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

您编写的代码严重损坏。请在提交之前验证匿名代码是否仍然有效。希望您将
baseClass
重命名为
baseClass
derivedClass
重命名为
derivedClass
,并在方法声明的参数中的逗号后加空格。当前,派生类与基类没有关系。为什么不使用新样式的类?@Ignacio Vazquez Abrams。这与匿名无关。我在django工作时遇到了这个问题。我知道这是python的问题。因此没有必要将django表单和视图的所有复杂性都放在这里。尽管如此,我还是为损坏的代码表示歉意。谢谢。但是,
#您正在使用命名参数,请将它们声明为命名参数。
。如果我不为参数提供默认值,它将不会成为命名参数?@Jibin:you call
derivedClass(name='Jibin')
,这是一个命名参数,如果将此参数声明为命名参数,则更为连贯。只是我不想为参数提供默认值,使其成为必需参数。
class BaseClass(object):
    def __init__(self, mark, name, **kwargs):
        self.mark = mark
        self.name = name
        self.__dict__.update(kwargs)
c.__class__ = CirclePlus