Python如何向子类添加_uinit__; param

Python如何向子类添加_uinit__; param,python,oop,Python,Oop,我有一个子类共享它的基类的_u__; init __;: class SubClass(BaseClass) def __init__(self, param, *args, **kwargs): super().__init__(*args, **kwargs) self.thing = param 我一直遇到的问题是子类uuu init_uuu参数“param”作为一个额外参数被传递到super()。这通常会给我一个错误,如: TypeError:

我有一个子类共享它的基类的_u__; init __;:

class SubClass(BaseClass)
    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.thing = param
我一直遇到的问题是子类uuu init_uuu参数“param”作为一个额外参数被传递到
super()。这通常会给我一个错误,如:

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given
我不想那样。我只希望“param”用于这些子类实例。如何停止将额外的参数发送到基类_uu_u_u_u_u,同时仍能在子类_uu_uu_u_u中使用它?重现问题的示例代码:

from unittest import TestCase


class TestCaseSubClass(TestCase):

    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)  # Just use whatever is in TestCase's init + our stuff
        self.thing = param
        print(self.thing)


class TestClass(TestCaseSubClass(param='bdfbdfb')):

        def test_stuff(self):
            print('test stuff here')
或者只使用原始python,没有导入,为什么我不能这样做?(同样的错误)


我将这个问题解释为“如何在不为子类定义
\uuu init\uuu
的情况下为其提供默认参数?”。一种可能的方法是将默认值定义为类属性,您可以在父类“
”中访问该属性:

from unittest import TestCase

class TestCaseSubClass(TestCase):
    _default_param = None
    def __init__(self, *args, **kwargs):
        param = kwargs.pop("param", self._default_param)
        super().__init__(*args, **kwargs)  # Just use whatever is in TestCase's init + our stuff
        self.thing = param

class TestClass(TestCaseSubClass):
    _default_param = "bdfbdfb"
    def test_stuff(self):
        print('test stuff here')

x = TestClass()
print(x.thing) #"bdfbdfb"
y = TestClass(param="foo")
print(y.thing) #"foo"
这种方法与问题中的参数格式不太匹配,因为现在
param
是一个只包含关键字的参数,而不是一个命名的位置参数。主要的实际区别是,除非通过名称引用它,否则不能为
param
提供参数:
z=TestClass(“foo”)
不会这样做


根据对该问题的编辑和评论,另一种可能的解释可能是“如何通过任何必要的方式向传递给父类的子类提供参数?”,它对默认值没有任何要求。如果您愿意将
param
设为强制参数,则在创建TestClass实例时只需传入该值:

from unittest import TestCase

class TestCaseSubClass(TestCase):
    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)  # Just use whatever is in TestCase's init + our stuff
        self.thing = param

class TestClass(TestCaseSubClass):
    def test_stuff(self):
        print('test stuff here')

x = TestClass("bdfbdfb")
print(x.thing) #"bdfbdfb"

我认为代码不应该给出那个错误。您编写它的方式(尽管存在语法错误)不应将
param
传递给父级的
\uuuu init\uuuu
。请提供一个例子。可能是因为我正在子类化什么?在本例中为unittest.TestCase。下面是一个工作示例:这就是您应该如何使用TestCase:我正在做的唯一一件事就是用我自己的子类扩展TestCase,您希望类实例
AB(param='thh')
在类定义中做什么?OHHHHH就是这样!当我定义ABC子类时,我认为您必须指定所需的AB参数。我想你不必这么做。在实例化ABC类时发送AB参数。回答就是这样。
from unittest import TestCase

class TestCaseSubClass(TestCase):
    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)  # Just use whatever is in TestCase's init + our stuff
        self.thing = param

class TestClass(TestCaseSubClass):
    def test_stuff(self):
        print('test stuff here')

x = TestClass("bdfbdfb")
print(x.thing) #"bdfbdfb"