0

我正在用 Python 构建一个网络爬虫。我创建了一个父类来保存用户和密码,我想通过键盘输入。

父类如下所示:

class ParentCrawler(object):
def __init__(self):
    """Saves the user and the password"""
    self.user = input("Email: ")
    self.password = getpass.getpass("Password: ")

然后我创建了该父类的一个子类,其想法是运行它的并行实例以加快爬行速度。但是每次我创建子类的新对象时,都会要求我输入用户并再次传递,如下图所示,这不是我想要的。

创建子对象时...

我知道我可以对我的用户进行硬编码并传递给父类构造函数方法,但我想知道每次程序运行时如何手动输入它们。

4

1 回答 1

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):
           ...
于 2017-07-11T16:07:04.037 回答