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
答案 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