如何使用子 class 的默认值调用父 class init?
How to call parent class init with default values from child class?
我正在尝试为子classes 提供默认变量并在文件越来越大时停止复制代码:
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
(当然所有登录样式都相似)。
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
属性,我该如何解决?谢谢
请注意删除基础 class 默认值会导致其他问题
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 块:
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
.
我正在尝试为子classes 提供默认变量并在文件越来越大时停止复制代码:
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
(当然所有登录样式都相似)。
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
属性,我该如何解决?谢谢
请注意删除基础 class 默认值会导致其他问题
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 块:
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
.