Py学习  »  Python

python如何向子类添加初始化参数

Rosey • 4 年前 • 979 次点击  

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

class SubClass(BaseClass)
    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.thing = param

我遇到的问题是子类init参数param被传递到 super().__init__(*args, **kwargs) 作为额外参数。这通常会给我一个错误,比如:

TypeError: __init__() takes from 1 to 2 positional arguments but 3 were given

我不想那样。我只希望“param”用于这些子类实例。如何停止向基类in it发送额外的参数,同时仍然能够在子类init中使用它?再现问题的示例代码:

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,没有导入,为什么我不能这样做?(相同的错误)

class A(object):
    def __init__(self, athing='thing'):
        self.thing = athing
        print(self.thing)

class AB(A):
    def __init__(self, param, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.param= param
        print(self.param)


class ABC(AB(param='thh')):
    pass

ABCinstance = ABC()
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43900
 
979 次点击  
文章 [ 1 ]  |  最新文章 4 年前
Kevin
Reply   •   1 楼
Kevin    5 年前

我把这个问题解释为“如何定义默认参数到子类而不定义 __init__ 是吗?”。一种可能的方法是将默认值定义为类属性,您可以在父类中访问该属性。 爱因斯坦 :

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 仅为关键字参数,而不是命名位置参数。主要的实际差异是你不能提供一个论点。 帕拉姆 除非你提到它的名字: z = TestClass("foo") 比如说,我不会这么做的。


基于对这个问题的编辑和注释,另一种可能的解释是:“如何通过任何必要的方法向传递给父类的子类提供一个参数?”,对于默认值没有任何要求。如果你愿意 帕拉姆 强制性的 参数,则只需在创建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"