2009-07-23 3 views
1
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 

Если я использую конструктор, то он выдает ошибку:Ошибка при использовании конструктора Python

onnetction = fileDetails('localhost',"root","",'bulsorbit') 
TypeError: __init__() takes exactly 4 arguments (5 given) 
+2

Вы имеете в виду self.usr = usr, а не self.usr.usr? –

+0

Какие ресурсы вы используете для изучения Python? Вы используете книгу? Сайт? Какая книга? Какой сайт? Где вы видели такие примеры? –

ответ

11

Перегрузка конструктора (или любой другой функции) не допускается в питона. Таким образом, вы не можете определить две функции __init__ для своего класса.

Вы можете посмотреть на this post или this one

Основные идеи использовать значения по умолчанию или создать «альтернативные Конструкторы» или проверить количество и типа ваших аргументов для того, чтобы выберите, какой метод применять.

def __init__(self, **args): 

Тогда args будет словарь, содержащий все параметры. Таким образом, вы будете иметь возможность сделать разницу между

connection = fileDetails(host='localhost',usr="root",pwd="",database='bulsorbit') 

и

connection = fileDetails(connection="...",sql="...",path="...") 
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 

Или что-то в этом роде.

1

В Python функции в классе хранятся внутри словаря (помните, что конструкторы являются просто регулярными функциями), и поэтому может существовать только одна функция с тем же именем. Поэтому при определении более чем одной функции с тем же именем последняя будет перезаписывать все ранее определенные, и вы получите только одну функцию.

Предлагаю вам ознакомиться с keyword and default arguments, чтобы увидеть правильный способ достижения желаемого.

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 
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 

Конечно, вы должны сделать соответствующую проверку типов и обработки ошибок в конструкторе.

0

На стороне примечание: если вы действительно, действительно, reallllllyyy должен сделать JiP (Java в Python), то несколько методов отправки могут быть возможны с некоторым дополнительным кодом, например. here и даже beter: here by BDFL.

Лично я стараюсь избегать их использования.

Смежные вопросы