派生类的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
,因为在realbaseClass
中有十个参数,而不是两个(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 callderivedClass(name='Jibin')
,这是一个命名参数,如果将此参数声明为命名参数,则更为连贯。只是我不想为参数提供默认值,使其成为必需参数。
class BaseClass(object):
def __init__(self, mark, name, **kwargs):
self.mark = mark
self.name = name
self.__dict__.update(kwargs)
c.__class__ = CirclePlus