在Python中输入超类变量

时间:2017-07-11 15:52:45

标签: python oop superclass keyboard-input

我正在使用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...

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

1 个答案:

答案 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):
           ...