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,这肯定会起作用,但我不喜欢允许使用某些参数(而不是其他参数)实例化该类。。我当然可以设置一个布尔条件,只在所有值都被传递的情况下设置参数,但这看起来很混乱。谢谢,这正是我想要的。