从子类访问超类对象
Access superclass objects from subclass
我对 classes 还是个新手,我正在努力实现一个子class。
所以我的 Nitin
class 是这样的:
import requests
from bs4 import BeautifulSoup
class Nitin(object):
def __init__(self, username, password):
self.username = username
self.password = password
self.session = requests.session()
self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}
def login(self):
self.session.auth = (self.username, self.password)
r = self.session.get(self.urls['models'])
return self.session
这一步没问题,因为我可以登录并且self.session
是在login()
函数中更新。现在我有一个 Model
subclass,它应该可以访问原始 Nitin.session
.
class Model(Nitin):
def __init__(self, nitin, model):
super(Model, self).__init__(nitin)
self.model = model
self.nitin = nitin
def media(self):
r = self.nitin.session.get(self.model)
print(r.status_code)
soup = BeautifulSoup(r.text, 'html.parser')
for table in soup.find('div', {'id': 'photobar'}).findAll('table'):
print(table)
我正尝试在我的主要代码中执行此操作,如下所示:
# Imports all Nitin classes
from src import *
# Initialize Nitin object
ripper = Nitin(username='aaaa', password='bbb')
# Initialize session with u/p
ripper.login()
# Initialize Model by passing the Nitin object to it, as well as a link
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
但这会引发以下异常:
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
File "/home/redact/git/redact/src/Nitin.py", line 32, in __init__
super(Model, self).__init__(nitin)
TypeError: __init__() missing 1 required positional argument: 'password'
我想我理解 classes worng。我实际上想做以下事情:
rippper = Nitin(username='aaaa', password='bbbb)
rippper.login()
rippper.Model.media()
但我不知道这是否可能。
我不是 100% 确定你要做什么,但错误是由于 Model
extends Nitin
另外包含它。实现这一点的行是
class Model(Nitin):
由于 Model
还包含对 Nitin
对象的引用,我怀疑您真的想要
class Model(object):
super(Model, self).__init__(nitin)
行试图调用 superclass 的构造函数。在这种情况下,使用一个参数 (nitin
) 调用 Nitin.__init__
,而不是所需的用户名和密码。
在这种情况下,我建议您 Model
扩展 object
并完全删除对 super(...).__init__
的所有调用。
扩展 class 意味着它的所有属性和功能都可用于扩展 class,而无需重新实现相同的代码。您的代码看起来只需要引用 Nitin
实例(您做的是正确的),而不是扩展它(您做的是错误的)。
要回答有关如何从 Nitin
引用 Model
的问题:您可以使用 self
作为 Nitin
在 Nitin.__init__
中初始化模型] 在对 Model.__init__
的调用中引用。您的 Nitin.__init__
看起来像这样:
def __init__(self, username, password, model_url):
self.username = username
self.password = password
self.session = requests.session()
self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}
self.model = Model(self, model_url)
然后您可以准确地执行您想要的代码,唯一的区别是您将模型 URL 传递给 Nitin
构造函数以及 model
属性小写:
rippper = Nitin(username='aaaa', password='bbbb', model_url='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
rippper.login()
rippper.model.media()
我对 classes 还是个新手,我正在努力实现一个子class。
所以我的 Nitin
class 是这样的:
import requests
from bs4 import BeautifulSoup
class Nitin(object):
def __init__(self, username, password):
self.username = username
self.password = password
self.session = requests.session()
self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}
def login(self):
self.session.auth = (self.username, self.password)
r = self.session.get(self.urls['models'])
return self.session
这一步没问题,因为我可以登录并且self.session
是在login()
函数中更新。现在我有一个 Model
subclass,它应该可以访问原始 Nitin.session
.
class Model(Nitin):
def __init__(self, nitin, model):
super(Model, self).__init__(nitin)
self.model = model
self.nitin = nitin
def media(self):
r = self.nitin.session.get(self.model)
print(r.status_code)
soup = BeautifulSoup(r.text, 'html.parser')
for table in soup.find('div', {'id': 'photobar'}).findAll('table'):
print(table)
我正尝试在我的主要代码中执行此操作,如下所示:
# Imports all Nitin classes
from src import *
# Initialize Nitin object
ripper = Nitin(username='aaaa', password='bbb')
# Initialize session with u/p
ripper.login()
# Initialize Model by passing the Nitin object to it, as well as a link
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
但这会引发以下异常:
model = Model(nitin=ripper, model='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
File "/home/redact/git/redact/src/Nitin.py", line 32, in __init__
super(Model, self).__init__(nitin)
TypeError: __init__() missing 1 required positional argument: 'password'
我想我理解 classes worng。我实际上想做以下事情:
rippper = Nitin(username='aaaa', password='bbbb)
rippper.login()
rippper.Model.media()
但我不知道这是否可能。
我不是 100% 确定你要做什么,但错误是由于 Model
extends Nitin
另外包含它。实现这一点的行是
class Model(Nitin):
由于 Model
还包含对 Nitin
对象的引用,我怀疑您真的想要
class Model(object):
super(Model, self).__init__(nitin)
行试图调用 superclass 的构造函数。在这种情况下,使用一个参数 (nitin
) 调用 Nitin.__init__
,而不是所需的用户名和密码。
在这种情况下,我建议您 Model
扩展 object
并完全删除对 super(...).__init__
的所有调用。
扩展 class 意味着它的所有属性和功能都可用于扩展 class,而无需重新实现相同的代码。您的代码看起来只需要引用 Nitin
实例(您做的是正确的),而不是扩展它(您做的是错误的)。
要回答有关如何从 Nitin
引用 Model
的问题:您可以使用 self
作为 Nitin
在 Nitin.__init__
中初始化模型] 在对 Model.__init__
的调用中引用。您的 Nitin.__init__
看起来像这样:
def __init__(self, username, password, model_url):
self.username = username
self.password = password
self.session = requests.session()
self.urls = {'base': 'http://nitinproductions.com/models/', 'models': 'http://nitinproductions.com/models/models.php'}
self.model = Model(self, model_url)
然后您可以准确地执行您想要的代码,唯一的区别是您将模型 URL 传递给 Nitin
构造函数以及 model
属性小写:
rippper = Nitin(username='aaaa', password='bbbb', model_url='http://nitinproductions.com/models/lexxiliegh/lexxiliegh.php')
rippper.login()
rippper.model.media()