Подтвердить что ты не робот

Python: __init __() принимает ровно 2 аргумента (3 данных)

Я пишу программу для поиска адаптеров и создаю класс под названием "Адаптер". Когда я передаю два аргумента, IDLE дает мне сообщение о том, что я прошел через три! Вот фрагмент кода и стека:

#This is the adapter class for the adapter finder script

class Adapter:
    side1 = (None,None)
    side2 = (None,None)
    '''The class that holds both sides of the adapter'''
    def __init__((pType1,pMF1),(pType2,pMF2)):
        '''Initiate the adapter.

        Keyword Arguments:
        pType1 -- The passed type of one side of the adapter. ex: BNC, RCA
        pMF1 -- The passed gender of pType1. ex: m, f

        pType2 -- The passed type of one side of the adapter. ex: BNC, RCA
        pMF2 -- The passed gender of pType2. ex: m, f

        '''

        print 'assigining now'
        side1 = (pType1,pMF1)
        print side1
        side2 = (pType2,pMF2)
        print side2

sideX = ('rca','m')
sideY = ('bnc','f')

x = Adapter(sideX,sideY)
print x.side1
print x.side2

Ошибка: Traceback (most recent call last): File "C:\Users\Cody\Documents\Code\Python\Adapter Finder\adapter.py", line 28, in <module> x = Adapter(sideX,sideY) TypeError: __init__() takes exactly 2 arguments (3 given)

Я не понимаю, в чем проблема, потому что я ввел только два аргумента!

Изменить: я новичок в языке python, хотя я знаю Java. Я использую эту страницу в качестве учебника: http://docs.python.org/tutorial/classes.html

4b9b3361

Ответ 1

Да, OP пропустил self, но я даже не знаю, что означают эти кортежи как аргументы, и я намеренно не потрудился понять это, это просто плохая конструкция.

Codysehi, пожалуйста, сравните свой код с:

class Adapter:
    def __init__(self, side1, side2):
        self.side1 = side1
        self.side2 = side2

sideX = ('rca', 'm')
sideY = ('bnc', 'f')
x = Adapter(sideX, sideY)

и убедитесь, что он более читабельен и делает то, что я думаю, что вы намерены.

Ответ 2

Вызов метода автоматически получает параметр "self" в качестве первого аргумента, поэтому make __init__() выглядит так:

def __init__(self, (pType1,pMF1),(pType2,pMF2)):

Это обычно подразумевается на других языках, в Python он должен быть явным. Также обратите внимание, что это действительно просто способ информирования метода экземпляра, к которому он принадлежит, вам не нужно называть его "я".

Ответ 3

Ваш __init__ должен выглядеть следующим образом:

def __init__(self,(pType1,pMF1),(pType2,pMF2)):

Ответ 4

Похоже, так Python приветствует всех, кто изучает язык. Вид первого укуса Python.

Вы должны указать self в методах экземпляра в качестве первого аргумента. Так должно быть.

  def __init__( self, (pType1,pMF1),(pType2,pMF2)):

Ответ 5

class Adapter:
side1 = (None,None)
side2 = (None,None)
'''The class that holds both sides of the adapter'''
def __init__(self,(pType1,pMF1),(pType2,pMF2)):
    '''Initiate the adapter.

Keyword Arguments:
    pType1 -- The passed type of one side of the adapter. ex: BNC, RCA
    pMF1 -- The passed gender of pType1. ex: m, f

    pType2 -- The passed type of one side of the adapter. ex: BNC, RCA
    pMF2 -- The passed gender of pType2. ex: m, f

    '''
    print 'assigining now'
    self.side1 = (pType1,pMF1)#i have changed from side1 to self.side1
    print self.side1#i have changed from side1 to self.side1
    self.side2 = (pType2,pMF2)#i have changed from side1 to self.side2
    print self.side2#i have changed from side1 to self.side2
sideX = ('rca','m')
sideY = ('bnc','f')

x = Adapter(sideX,sideY)
print x.side1
print x.side2

смотрите вывод ниже.

program output