使用Python构造函数时出错

时间:2009-07-23 09:54:48

标签: python constructor

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)

6 个答案:

答案 0 :(得分:11)

python中不允许重载构造函数(或任何其他函数)。因此,您无法为您的班级定义两个__init__函数。

您可以查看this postthis one

主要想法是使用默认值创建“备用构造函数”来检查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

我个人试图避免使用它们。