社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Rosey • 5 年前 • 1728 次点击  

我有一个子类共享它的基类的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
 
1728 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Kevin
Reply   •   1 楼
Kevin    6 年前

我把这个问题解释为“如何定义默认参数到子类而不定义 __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"