Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当我尝试使用默认构造函数实例化对象时,为什么会因为调用参数化构造函数而出现错误?_Python_Python 3.x_Constructor_Default Constructor - Fatal编程技术网

Python 当我尝试使用默认构造函数实例化对象时,为什么会因为调用参数化构造函数而出现错误?

Python 当我尝试使用默认构造函数实例化对象时,为什么会因为调用参数化构造函数而出现错误?,python,python-3.x,constructor,default-constructor,Python,Python 3.x,Constructor,Default Constructor,关于我为什么不能调用默认构造函数,有什么想法吗? 下面是该类的一小部分,以便您可以看到可用的构造函数和一些数据成员: class TweetExplorer: CLEAN_OUTPUT_PATH = constants.CLEAN_OUTPUT_PATH # Authorization keys API_KEY = '' API_SECRET_KEY = '' ACCESS_TOKEN = '' ACCESS_TOKEN_SECRET = ''

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

下面是该类的一小部分,以便您可以看到可用的构造函数和一些数据成员:

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” Source=C:\Source\repos\TweetExplorer\TweetExplorer.py 堆栈跟踪: 文件“C:\source\repos\TweetExplorer\TweetExplorer.py”,第499行,在 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

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

您不能以这种方式重写
\uuuuu init\uuuu
方法。第二个定义“覆盖”了第一个定义,我认为默认构造函数有某种规则,但我找不到任何东西。那么,您建议如何在不向构造函数传递任何参数的情况下实例化对象?对于您的情况:第一个构造函数是否有效?我不认为一个没有任何证书的tweet浏览器会有什么好处。否则,您可以将参数作为默认设置为的关键字参数None@IainShelvington关于将参数默认为None,这肯定会起作用,但我不喜欢允许使用某些参数(而不是其他参数)实例化该类。。我当然可以设置一个布尔条件,只在所有值都被传递的情况下设置参数,但这看起来很混乱。谢谢,这正是我想要的。