class fileDetails :
def __init__(self,host,usr,pwd,database):
self.host=host
self.usr.usr
self.pwd=pwd
self.database=database
def __init__(self,connection,sql,path):
self.connection=mysql_connection()
self.sql=sql
self.path=path
如果我使用构造函数,则会出错:
onnetction = fileDetails('localhost',"root","",'bulsorbit')
TypeError: __init__() takes exactly 4 arguments (5 given)
答案 0 :(得分:11)
python中不允许重载构造函数(或任何其他函数)。因此,您无法为您的班级定义两个__init__
函数。
主要想法是使用默认值或创建“备用构造函数”或来检查args的数量和类型,以便选择哪种方法应用
def __init__(self, **args):
然后args
将是包含所有参数的字典。所以你将能够区分
connection = fileDetails(host='localhost',usr="root",pwd="",database='bulsorbit')
和
connection = fileDetails(connection="...",sql="...",path="...")
答案 1 :(得分:4)
使用可选参数定义单个构造函数。
def __init__(self,host='host',usr='user',pwd='pwd',database='db',connection=None,sql=None,path=None):
if connection:
# however you want to store your connection
self.sql=sql
self.path=path
else:
self.host=host
self.usr.usr
self.pwd=pwd
self.database=database
或类似的东西。
答案 2 :(得分:1)
在Python中,类中的函数存储在字典内部(请记住构造函数只是常规函数),因此只能存在一个同名函数。因此,当定义多个具有相同名称的函数时,最后一个函数将覆盖之前定义的所有函数,并且最终只能使用一个函数。
我建议您调查keyword and default arguments,看看实现目标的正确方法。
答案 3 :(得分:1)
也许您可以使用len()来选择正确的分支:
class Foo(object):
def __init__(self, *args):
if len(args) == 4: # network
self.host = args[0]
self.user = args[1]
self.pwd = args[2]
self.database = args[3]
elif len(args) == 3: # database
self.connection = mysql_connection() # maybe it's args[0]?
self.sql = args[1]
self.path = args[2]
def main():
foo = Foo('localhost',"root","",'bulsorbit')
print foo.host
if __name__ == "__main__":
main()
# output
# localhost
但是,正确显式优于隐式。也许这也是可行的:
class Foo(object):
def __init__(self, initdata):
if initdata['style'] == 'network':
self.host = initdata['host']
self.usr = initdata['usr']
self.pwd = initdata['pwd']
self.database = initdata['database']
elif initdata[style] == 'database':
self.connection = mysql_connection()
self.sql = initdata['sql']
self.path = initdata['path']
def main():
data = dict({'style': 'network',
'host': 'localhost',
'usr': 'root',
'pwd': '',
'database': 'database'})
foo = Foo(data)
print foo.host
if __name__ == "__main__":
main()
# output
# localhost
答案 4 :(得分:0)
这是实现这一目标的一种方法:
class FileDetails:
def __init__(self, *args, **kwargs):
if len(args) == 3:
self.conn, self.sql, self.path = args
elif len(args) == 4:
self.host, self.usr, self.pw, self.db = args
else:
# handle appropriately
fd1 = FileDetail('connstring', 'select * from foo', '/some/path')
print fd1.conn, fd1.sql, fd1.path
fd2 = FileDetail('host', 'user', 'pass', 'somedb')
print fd2.conn, fd2.usr, fd2.pw, fd2.db
当然,您应该在构造函数中进行适当的类型检查和错误处理。
答案 5 :(得分:0)
旁注:如果你真的,真的,那么你必须做JiP(Python中的Java),然后使用一些额外的代码可以实现多种调度方法 。 here甚至更好:here by BDFL。
我个人试图避免使用它们。