如何使用子类的默认值调用父类的init? [英] How to call parent class init with default values from child class?

查看:145
本文介绍了如何使用子类的默认值调用父类的init?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为子类提供默认变量,并在文件变胖时停止重复代码:

I am trying to give my subclasses default variables and stop duplicating code as the file is getting fat:

class Base(object):

    def __init__(self, username=None, password=None, start_url=None):
        self.username  = username
        self.password  = password
        self.start_url = start_url

class Subclass(Base):

    def __init__(self, username="hoss_it87", password="whatsgoodSO", start_url="www.boss-sauce.com"):
        super(Subclass, self).__init__()

Base当然可以,但是我希望Subclass以相同的方式初始化,只是用真实的字符串覆盖None(当然,所有登录样式都是相似的).

Base works of course, but I want Subclass to init the same way, just overriding the None with real strings (all login styles are similar of course).

In [12]: x = Base('myuser', 'mypassword', 'www.google.com')

In [13]: x.username
Out[13]: 'myuser'

In [14]: x.start_url
Out[14]: 'www.google.com'

In [15]: y = Subclass()

In [16]: y.username

In [17]: y.start_url

In [18]: y.password

In [19]: 

为什么对于Subclass属性我什么也没得到,怎么解决?谢谢

Why do I get nothing for Subclass attributes, and how can I fix it? Thank you

请注意,删除基类默认设置会导致其他问题

Please note removing base class defaults causes other issues

class Base(object):

    def __init__(self, username, password, start_url):
        self.username  = username
        self.password  = password
        self.start_url = start_url

class Subclass(Base):

    def __init__(self, username="honeybooboosbiggestfan", password="toomuchburkerking", start_url="www.imjokingiprefericeroadtruckers.com"):
        super(Subclass, self).__init__()


In [24]: y = Subclass()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-55b9b4fdf93b> in <module>()
----> 1 y = Subclass()

<ipython-input-23-a9dc62450db7> in __init__(self, username, password, start_url)
      9 
     10     def __init__(self, username="honeybooboosbiggestfan", password="toomuchburkerking", start_url="www.imjokingiprefericeroadtruckers.com"):
---> 11         super(Subclass, self).__init__()

TypeError: __init__() takes exactly 4 arguments (1 given)

In [25]: 

已解决:

class Base(object):

    def __init__(self, username, password, start_url):
        self.username  = username
        self.password  = password
        self.start_url = start_url

class Subclass(Base):

    def __init__(self, username="honeybooboosbiggestfan", password="toomuchburkerking", start_url="www.imjokingiprefericeroadtruckers.com"):
        super(Subclass, self).__init__(username=username, password=password, start_url=start_url)

## -- End pasted text --

In [26]: y = Subclass()

In [27]: y.username
Out[27]: 'honeybooboosbiggestfan'

In [28]: 

推荐答案

您必须将参数从SubClass init传递给Base的init块:

You have to pass the arguments from the SubClass init to the init block of Base:

class Subclass(Base):

    def __init__(self, username="hoss_it87", password="whatsgoodSO", start_url="www.boss-sauce.com"):
        super(Subclass, self).__init__(username=username, password=password, start_url=start_url)

在您的代码中,调用Base的init时不带参数,因此采用其默认参数,它们都是None.

In your code, the Base init is called without arguments and thus takes its default arguments, which are all None.

这篇关于如何使用子类的默认值调用父类的init?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆