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

Why am I getting an error based on my parameterized constructor being called when I try to instantiate an object using my default constructor?

关于为什么我无法调用默认构造函数有什么想法吗?

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

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 

因此,在同一文件中,我尝试使用默认构造函数实例化 class 的实例:

if __name__ == '__main__':

    explorer = TweetExplorer()

我没有调用默认构造函数,而是收到以下错误:

Message=init() missing 4 required positional arguments: 'api_key', 'api_secret_key', 'access_token', and 'access_token_secret' Source=C:\source\repos\TweetExplorer\TweetExplorer.py StackTrace: File "C:\source\repos\TweetExplorer\TweetExplorer.py", line 499, in explorer = TweetExplorer()

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

我之前使用的提供多个构造函数的模式是使用 classmethods:

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)