我正在使用Python构建一个Web爬虫。我创建了一个父类来保存用户和密码,我希望通过键盘输入。
父类看起来像这样:
class ParentCrawler(object):
def __init__(self):
"""Saves the user and the password"""
self.user = input("Email: ")
self.password = getpass.getpass("Password: ")
然后我创建了该父类的子类,其想法是运行它的并行实例以使爬行更快。但每次我创建一个新的儿童类对象时,我都要求输入用户并再次传递,如下图所示,这不是我想要的。
When a child object is created...
我知道我可以硬编码我的用户并传递给父类构造函数方法,但我想知道每次程序运行时如何手动输入它们。
答案 0 :(得分:1)
每次创建新实例时,都会运行类的__init__
方法。由于这些值只需要一次,并且您不需要为每个实例使用不同的值,因此在类初始化程序或其他方法中请求它们的值没有意义。
此外,如果您的类与终端上的用户交互无关,则没有理由在类代码中对此用户交互进行硬编码 - 如果您对将使用相同类的程序进行修改,并获得此例如,来自配置文件或POSTed Web表单的信息,您将无法以这种方式使用这些类。
在实例化类时,将凭据作为必需值传递没有错。要在终端上以交互方式继续开发和使用您的程序,您可以创建一个简单的函数来请求这些输入数据并返回它们 -
NUM_WORKERS = 4
def get_credentials():
user = input("Email: ")
password = getpass.getpass("Password: ")
return user, password
def main():
workers = []
user, password = get_credentials()
for i in range(NUM_WORKERS):
worker = Crawler(user, password)
workers.append(worker)
worker.start()
...
class Crawler:
def __init__(self, user, password):
...