为什么当我尝试使用默认构造函数实例化对象时,基于参数化构造函数的调用会导致错误?

问题描述 投票:1回答:2

关于为什么我无法调用默认构造函数的任何想法?

这里是类的一小部分,因此您可以看到可用的构造函数和一些数据成员:

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()

而不是调用默认构造函数,但出现以下错误:

Message = init()缺少4个必需的位置参数:'api_key','api_secret_key','access_token'和'access_token_secret'源= C:\ source \ repos \ TweetExplorer \ TweetExplorer.py堆栈跟踪:在第499行的文件“ C:\ source \ repos \ TweetExplorer \ TweetExplorer.py”资源管理器= TweetExplorer()

python python-3.x constructor default-constructor
2个回答
1
投票

我之前用于提供多个构造函数的模式是使用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
投票

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
© www.soinside.com 2019 - 2024. All rights reserved.