2012-03-02 4 views
2

Я понятия не имею, что не так! Это очень простая программа, и я сделал много головокружительных ударов! Пожалуйста, кто-нибудь просветит меня!TypeError в Python 3.x

Это лабораторная проблема из курса CSE 111 - Programming Language II. Они учат Java в университете, и код, написанный на Java, отлично работает.

Мне просто нужно создать класс Student с некоторыми полями, чтобы содержать основную информацию об ученике с методами получения и установки атрибутов. Затем создайте экземпляр этого класса и попробуйте методы. Но каждый раз, когда я запускаю эту программу возникает следующая ошибка:

TypeError: set_name() takes exactly 1 positional argument (2 given) 

Вот код, который я написал.

class Student: 
    '''Student class''' 

    name = None 
    id = 0 
    address = None 
    cgpa = None 

    def get_name(): 
     return name 

    def set_name(n): 
     name = n 

    def get_id(): 
     return id 

    def set_id(i): 
     id = i 

    def get_address(): 
     return address 

    def set_address(a): 
     address = a 

    def get_cgpa(): 
     return cgpa 

    def set_cgpa(c): 
     cgpa = c 


#An object of Student class 
jack = Student() 

jack.set_name('jacky') 
print(jack.get_name()) 

ответ

6

Вы не принимает ссылку на экземпляр в качестве первого аргумента этого метода, то есть ваш set_name() должно быть написано:

def set_name(self, n): 
    self.name = n 

Это несколько отличается от других языков, где есть встроенное ключевое слово (например, this), которое относится к текущему объекту. Python передает эту ссылку явно, как аргумент метода.

Все остальные методы должны быть изменены аналогичным образом.

Обратите внимание, что только установка name = n устанавливает локальную переменную name, которая исчезает при завершении метода; он ничего не устанавливает в экземпляре. Вы должны явно указать self.name, если вам нужен атрибут экземпляра.

Также, это вопрос стиля, но обычно вы не пишете и get методов в Python. Обычная практика - устанавливать и получать атрибуты напрямую. Если вы хотите выполнить проверку значений, используйте свойство вместо этого. Таким образом, ни один из ваших методов на самом деле не нужен в хорошем стиле.

Однако у вас нет метода __init__(). Обычно вы должны передать нужные атрибуты экземпляра при создании экземпляра класса и сохранить их в экземпляре.

class Student: 

    def __init__(self, name, id, address, cgpa): 
     self.name = name 
     self.id  = id 
     self.address = address 
     self.cgpa = cgpa 

herman = Student("Herman Munster", 12345, "1313 Mockingbird Lane", 4.0) 
+0

большое спасибо! Я новичок в Python, и я понятия не имел о 'self':/ – Ratul

1

Это потому, что первым аргументом методов является self - экземпляр класса.

См What is the purpose of self? и http://docs.python.org/tutorial/classes.html#class-objects

+0

Спасибо :) Я не знал об этом, так как я новичок в Python. – Ratul

+0

@mnzrr, да, это необычно, но пригодится, когда вы больше работаете с Python. Смотрите: http://stackoverflow.com/questions/2709821/python-self-explained – warvariuc

+0

Еще раз спасибо warwaruk! Я следовал за несколькими книгами, включая «Байт Python», но ничего не видел о «себе» :) Я должен прочитать более внимательно> :( – Ratul

1

В Python, вам нужно пройти в self для каждого из ваших функций-членов. Вам также необходимо указать переменные класса как self.x, если вы хотите, чтобы они вступили в силу.

Вот несколько примеров, которые необходимо применить к остальной части вашего кода.

def set_name(self, n): 
     self.name = n 

    def get_cgpa(self): 
     return self.cgpa 

Существует несколько объяснений, почему это так in the documentation.

+0

Спасибо за ваш быстрый ответ! – Ratul

2

Попробуйте это:

import sys 
class Student: 
    '''Student class''' 

    self.name = None 
    self.id = 0 
    self.address = None 
    self.cgpa = None 

    def get_name(self): 
     return self.name 

    def set_name(self, n): 
     self.name = n 

    def get_id(self): 
     return self.id 

    def set_id(self, i): 
     self.id = i 

    def get_address(self): 
     return self.address 

    def set_address(self, a): 
     self.address = a 

    def get_cgpa(self): 
     return self.cgpa 

    def set_cgpa(self, c): 
     self.cgpa = c 
+0

Спасибо! Вам не пришлось переписывать хотя :) – Ratul

2

Вам необходимо пройти self в качестве первого аргумента для каждой функции члена класса. Затем переменные-члены должны ссылаться на self, то есть self.name. Кроме того, вы можете включить функцию __init__(); это обычно служит для инициализации любых переменных-членов и вызывается при создании класса.

Посмотрите на документацию Python здесь несколько примеров на хорошо образованных классов: http://docs.python.org/tutorial/classes.html#random-remarks

+0

Спасибо Aphnex! :) – Ratul