Python Классы: объект 'int' не имеет атрибута в функции в моем классе - PullRequest
0 голосов
/ 07 января 2020

Я новичок в Python объектно-ориентированном программировании. Я скопировал этот код онлайн, чтобы лучше понять, как OOP работал в Python. Вот код:

class Student:

    def __init__(self, name, student_number):
        ## Student has-a name
        self.name = name
        ## Student has-a student number
        self.student_number = student_number
        ## Student has-many classes
        self.classes = []

    def enrol(self, course_running):
        ## Append the list, classes with variable course_running
        self.classes.append(course_running)
        ## Call course_running with the add_student function in a class
        course_running.add_student(self)

class Department:

    def __init__(self, name, department_code):
        ## Department has-a name
        self.name = name
        ## Department has-a code
        self.department_code = department_code
        ## Department has-many courses
        self.courses = {}

    def add_course(self, description, course_code, credits):
        self.courses[course_code] = Course(self, description, course_code, credits)
        return self.courses[course_code]

class Course:

    def __init__(self, description, course_code, credits, department):
        ## Course has-a description
        self.description = description
        ## Course has-a code
        self.course_code = course_code
        ## Course has-many credits
        self.credits = credits
        ## Course has-a deparmtnet
        self.department = department
        ## Adds the aforementioned course to the necessary DPT; it is usefull because
        ## it automatically adds this course to the DPT given in its parameter
        self.department.add_course(self)
        ## Course has-many runnings
        self.runnings = []

        def add_running(self, year):
            self.runnings.append(CourseRunning(self, year))
            return self.runnings[-1]

class CourseRunning:

    def __init__(self, course, year):
        ## CourseRunning has-a year
        self.course = course
        ## CourseRunning has-a year
        self.year = year
        ## CourseRunning has-many students
        self.students = []

    def add_student(self, student):
        self.students.append(student)

maths_dept = Department("Mathematics and Applied Mathemtics", "MAM")
mam1000w = maths_dept.add_course("Mathematics 1000", "MAM1000W", 1)
mam1000w_2013 = mam1000w.add_running(2013)

bob = Student("Bob", "Smith")
bob.enrol(mam1000w_2013)

Тем не менее, я продолжаю получать эти ошибки:

Traceback (most recent call last):
  File "ex42c.py", line 70, in <module>
    mam1000w = maths_dept.add_course("Mathematics 1000", "MAM1000W", 1)
  File "ex42c.py", line 30, in add_course
    self.courses[course_code] = Course(self, description, course_code, credits)
  File "ex42c.py", line 47, in __init__
    self.department.add_course(self)
AttributeError: 'int' object has no attribute 'add_course'

Я изменил объект 'int' в объект 'list', а затем объект 'str' , но они дали похожие ошибки. Когда я удалил целочисленные переменные и все переменные «credit», произошла та же ошибка с переменными «course_code» и str «MAM1000W». По сути, я хочу понять, почему я не могу передать эти параметры функции.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Первая проблема заключается в том, что вы передаете аргументы Course в неправильном порядке.

Вместо self.courses[course_code] = Course(self, description, course_code, credits)

Вам нужно self.courses[course_code] = Course(description, course_code, credits, self)

Потому что в вашем Course.__init__ они есть в таком порядке: def __init__(self, description, course_code, credits, department).

Но тогда у вас есть рекурсивная l oop, где функция add_course вызывается Course __init__, которая вызывается при создании Course в add_course .. . и так далее и тому подобное.

Кроме этого тоже не произойдет, потому что в вашем вызове self.department.add_course(self) в Course.__init__ отсутствуют два обязательных аргумента для Department.add_course - course_code и credits

Короче говоря: у вас здесь много проблем. Мы могли бы исправить большинство из них, но решение о рекурсивном вызове add_course потребует от вас решить, хотите ли вы, чтобы отдел добавлял курсы, или курсы, добавляющие себя в отделы.

0 голосов
/ 07 января 2020

Delete this

После удаления вышеприведенного (self.department.add_course (self)), пожалуйста, удалите отступ ниже:

def add_running(self, year):
    self.runnings.append(CourseRunning(self, year))
    return self.runnings[-1]

Это работает для я, хотя я не уверен, что именно так вы хотели, чтобы это работало.

Ранее это не сработало, потому что вы пытались использовать метод Department из класса Course. Отдел был просто аргументом типа Integer вместо объекта Department, который вы, вероятно, хотели. Тот же самый метод уже существует в классе Department, так почему бы не использовать его только?

Во второй части был удален отступ функции add_running (), так как он был введен в блоке курса init .

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...