Почему я получаю сообщение об ошибке из-за вызова моего параметризованного конструктора, когда я пытаюсь создать экземпляр объекта с помощью моего конструктора по умолчанию? - PullRequest
1 голос
/ 23 декабря 2019

Есть мысли, почему я не могу вызвать конструктор по умолчанию?

Вот небольшая часть класса, чтобы вы могли увидеть доступные конструкторы и некоторые данные. members:

class TweetExplorer:

    CLEAN_OUTPUT_PATH = constants.CLEAN_OUTPUT_PATH

    # Authorization keys
    API_KEY = ''
    API_SECRET_KEY = ''
    ACCESS_TOKEN = ''
    ACCESS_TOKEN_SECRET = ''

    OUTPUT_PATH = '' 

    API_ACCESS = 0

    def __init__(self):

        self.OUTPUT_PATH = constants.OUTPUT_PATH 
        self.CLEAN_OUTPUT_PATH = constants.OUTPUT_PATH


def __init__(self, api_key, api_secret_key, access_token, access_token_secret):

    self.API_KEY = api_key
    self.API_SECRET_KEY = api_secret_key
    self.ACCESS_TOKEN = access_token
    self.ACCESS_TOKEN_SECRET = access_token_secret

    try: 
        self.check_access()
    except Exception as ex:
        print(ex)

    self.OUTPUT_PATH = constants.OUTPUT_PATH 

Итак, в том же файле я пытаюсь создать экземпляр класса, используя конструктор по умолчанию:

if __name__ == '__main__':

    explorer = TweetExplorer()

Вместо вызова конструктора по умолчанию, яполучить следующую ошибку:

Сообщение = init () отсутствует 4 обязательных позиционных аргумента: 'api_key', 'api_secret_key', 'access_token' и 'access_token_secret' Source = C: \ source \ repos \ TweetExplorer \ TweetExplorer.py StackTrace: файл "C: \ source \ repos \ TweetExplorer \ TweetExplorer.py", строка 499, в обозревателе = TweetExplorer ()

Ответы [ 2 ]

1 голос
/ 23 декабря 2019

Шаблон, который я использовал ранее для предоставления нескольких конструкторов, должен использовать classmethod s:

class TweetExplorer:

    CLEAN_OUTPUT_PATH = constants.CLEAN_OUTPUT_PATH
    API_ACCESS = 0

    def __init__(self):
        self.OUTPUT_PATH = constants.OUTPUT_PATH
        self.CLEAN_OUTPUT_PATH = constants.OUTPUT_PATH
        self.API_KEY = ''
        self.API_SECRET_KEY = ''
        self.ACCESS_TOKEN = ''
        self.ACCESS_TOKEN_SECRET = ''

    @classmethod
    def with_credentials(cls, api_key, api_secret_key, access_token, access_token_secret):
        obj = cls()

        obj.API_KEY = api_key
        obj.API_SECRET_KEY = api_secret_key
        obj.ACCESS_TOKEN = access_token
        obj.ACCESS_TOKEN_SECRET = access_token_secret

        try:
            obj.check_access()
        except Exception as ex:
            print(ex)

        return obj

Теперь вы можете инициализировать TweetExplorer без каких-либо аргументов

TweetExplorer()

Илис кредитами

TweetExplorer.with_credentials(api_key, api_secret_key, access_token, access_token_secret)
0 голосов
/ 23 декабря 2019

Python переопределит первое объявление init . Чтобы получить необязательные параметры со значениями по умолчанию, вы можете сделать что-то вроде

def __init__(self, api_key='', api_secret_key='', access_token='', access_token_secret=''):
    self.API_KEY = api_key
    self.API_SECRET_KEY = api_secret_key
    self.ACCESS_TOKEN = access_token
    self.ACCESS_TOKEN_SECRET = access_token_secret
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...