Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Знатоки Питона, помогите  (Прочитано 9550 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Angela
Гость
« : 19-03-2006 17:35 » 

Не поможет ли кто?  Язык Python.
Нужно разобраться с программой (основные функции и что делает каждая строчка). Этот язык для меня новый, разбираться по книжкам пытаюсь, но понятть программу пока не получается (а очень хочется  и нужно). Поэтому прошу оказать помощь всех кому не сложно!
Содержание классов (синтаксис) вроде повторяется, поэтому, если не затруднит разъясните, хотябы первый и последний класс "Должность" и "Занятие". Заранее огромное спасибо!!
Код:
"""
Университет
"""

class Position:
  """
  Должность
  """
  counter = 0
  positions = set()

  def __init__(self, name):
    Position.counter += 1
    self.code = Position.counter
    self.name = name
    Position.positions.add(self)

  def __hash__(self):
    return hash(self.code)

class Teacher:
  """
  Преподаватель
  """
  counter = 0
  teachers = set()

  def __init__(self, name, adress, position):
    assert position in Position.positions
    Teacher.counter += 1
    self.number = Teacher.counter
    self.name = name
    self.adress = adress
    self.position = position
    Teacher.teachers.add(self)

  def __hash__(self):
    return hash(self.number)

class Chair:
  """
  Кафедра
  """
  counter = 0
  chairs = set()

  def __init__(self, name, (chairName, adress, position)):
    Chair.counter += 1
    self.code = Chair.counter
    self.name = name
    headChair = Teacher(chairName, adress, position)
    self.headChair = headChair
    self.teachers = [headChair]
    Chair.chairs.add(self)

  def addTeacher(self, name, adress, position):
    teacher = Teacher(name, adress, position)
    self.teachers.append(teacher)
    return teacher

  def __hash__(self):
    return hash(self.code)

class Auditorium:
  """
  Аудитория
  """
  counter = 0
  auditoriums = set()

  def __init__(self, name):
    Auditorium.counter += 1
    self.number = Auditorium.counter
    self.name = name
    Auditorium.auditoriums.add(self)

  def __hash__(self):
    return hash(self.number)

class Examination:
  """
  Экзамен
  """
  counter = 0
  examinations = set()

  def __init__(self, name):
    Examination.counter += 1
    self.code = Examination.counter
    self.name = name
    Examination.examinations.add(self)

  def __hash__(self):
    return hash(self.code)

class Subject:
  """
  Предмет
  """
  counter = 0
  subjects = set()

  def __init__(self, name, hours, examination):
    assert examination in Examination.examinations
    Subject.counter += 1
    self.code = Subject.counter
    self.name = name
    self.hours = hours
    self.examination = examination
    Subject.subjects.add(self)

  def __hash__(self):
    return hash(self.code)

class Lesson:
  """
  Занятие
  """
  lessons = []

  def __init__(self, teacher, subject, auditorium):
    assert teacher in Teacher.teachers
    assert subject in Subject.subjects
    assert auditorium in Auditorium.auditoriums
    self.teacher = teacher
    self.subject = subject
    self.auditorium = auditorium
    Lesson.lessons.append(self)

if __name__ == "__main__":
  assistant = Position('ассистент')
  lecturer = Position('доцент')
  professor = Position('профессор')

  chair = Chair('КА&ТЧ', ('Кузнецов В.Н.', 'Саратов', professor))
  teach1 = chair.addTeacher('Блинков Ю.А.', 'Саратов', lecturer)
  teach2 = chair.addTeacher('Ромакина О.М.', 'Саратов', assistant)

  aud1 = Auditorium('им.Вавилова')
  aud2 = Auditorium('111')

  exam1 = Examination('зачет')
  exam2 = Examination('экзамен')

  sub1 = Subject('Проектирование ИС(лек)', 2, exam1)
  sub2 = Subject('Проектирование ИС(прак)', 2, exam2)
  sub3 = Subject('Алгебра', 2, exam1)

  Lesson(chair.headChair, sub3, aud1)
  Lesson(teach1, sub1, aud1)
  Lesson(teach2, sub2, aud2)
  Lesson(teach2, sub2, aud2)

  for lesson in Lesson.lessons:
    print "%13s" % lesson.teacher.name,
    print "%13s" % lesson.teacher.position.name,
    print "%23s" % lesson.subject.name,
    print "%2d"  % lesson.subject.hours,
    print "%6s"  % lesson.subject.examination.name,
    print "%15s" % lesson.auditorium.name
[\code]
« Последнее редактирование: 04-12-2007 21:22 от Алексей1153++ » Записан
Алексей++
кот глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 19-03-2006 18:46 » 

а что за язык-то? Улыбаюсь
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #2 : 19-03-2006 18:55 » 

Алексей1153, http://ru.wikipedia.org/wiki/Python
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 19-03-2006 21:58 » 

Angela, я то же не знаю этого языка, но логически что-то понять можно...
Для пробы:
class Position:

rem Как я понимаю, это статичекие данные класса
counter = 0
positions = set()

rem Метод инициализации нового объекта
def __init__(self, name):
Position.counter += 1
self.code = Position.counter
self.name = name
Position.positions.add(self)

rem Точно сказать не могу, но явно это поддержка какого-то внутреннего механизма.
def __hash__(self):
return hash(self.code)


Текста много, по этому лучше задавай вопросы про конкретные места.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.

Хз, я не очень просто не очень во всё это верю, во всякие там сатурны и прочую поебень.
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 20-03-2006 07:54 » 

Если не затруднит, запостите текст программы, вложив в скобки [code] и [/code]
то есть в теле поста напишите [code], затем paste вашего кода, затем напишите [/code]

Дело в том, что в языке Python отступы обозначают вложенность в блочной структуре.  Без правильно расставленных отступов затруднительно читать.

И ещё, пожалуйста, сообщите, что именно вы хотите узнать об этой программе.
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Angela
Гость
« Ответ #5 : 20-03-2006 08:08 » 

Сразу, огромное спасибо всем кто откликнулся.
Finch, интересная ссылка (кое-что помогло).
npak, в принципе смысл программы понятен, но нужно знать, что делает каждая строчка.  Классы во многом одинаковы, поэтому прошу помочь с первым классом "Должность" и последним "Занятие", дабы направить в нужное русло. Дальше  я постараюсь сама. Огромное спасибо!
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 20-03-2006 08:49 » 

Класс Position.

Класс не является наследником какого-либо класса. Строка "class Position" создаёт объект типа "класс" (class object, http://docs.python.org/ref/class.html).  В объекте типа "класс" заводится словарь (dictionary), в котором хранятся статические переменные класса и методы.
Последующие строки идут с отступом, это означает, что объекты, которые они определяют, включаются в структуру класса Position.
Строка "counter = 0" создаёт статическую переменную с именем counter класса Position и инициализирует её нулём.
Строка "positions = set()" создаёт статическую переменную с именем positions класса Position и инициализирует её пустым множеством.

В питоне методы являются обычными функциями, поэтому в каждый метод должна передаваться явная ссылка на объект, метод которого вызван.  То есть, если вы хотите, чтобы ваш метод вызывался как obj.meth(), то метод надо описывать как "def meth(self):"

Метод со специальным именем __init__ вызывается при создании объекта класса Position.  Это аналог конструкторов в обычных ОО языках.
Объекты в Python создаются так: ИмяКласса(аргумент1, аргумент2, ..., аргумент_n).  К списку аргументов, следующих после ИмяКласса, будет спереди приделана ссылка на инициализируемый объект и полученный список будет передан в метод __init__.   В конце вашего файла есть пример " assistant = Position('ассистент')" .  При выполнении этого выражения будет создан объект Position, и будет вызван метод
Position.__init__(ссылка_на_новый_объект, 'ассистент').

Метод со специальным именем __hash__ используется для вычисления хэш-кода объекта.

Метод __init__ класса Position.  Последующие строки идут с отступом, это означает, что они составляют тело метода.
"Position.counter += 1" -- статическая переменная counter класса Position увеличивается на 1.  Судя по коду, эта переменная используется для подсчёта числа созданных позиций.
"self.code = Position.counter" - с каждым объектом связан словарь (dictionary), в котором хранятся переменные объекта.  В языке питон не надо декларировать поля объекта заранее.  Переменная создаётся автоматически при первом присваивании.  в данном случае переменная code текущего объекта будет создана и ей будет присвоено значение Position.counter
"self.name = name" - создаётся поле объекта с именем name и приравнивается одноимённому аргументу конструктора.
"Position.positions.add(self)" - новосозданный объект класса Position (переменная self) заносится (метод add) во множество из переменной Position.positions.  Судя по коду, это глобальное хранилище всех созданных позиций.

Метод __hash__ класса Position.  Вычисляет хэш-код на основе значения поля code.
« Последнее редактирование: 04-12-2007 21:23 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 20-03-2006 09:28 » 

Класс Lesson (Занятие)
"class Lesson:" - создаёт новый класс
"  lessons = []" - создаёт статическую переменую и инициализирует её пустым массивом

"  def __init__(self, teacher, subject, auditorium):" - создаёт конструктор класса.  Конструктор принимает три аргумента - teacher, subject и auditorium

"    assert teacher in Teacher.teachers" - если аргумент teacher не принадлежит множеству преподавателей, то будет выброшено исключение AssertionError (http://docs.python.org/ref/assert.html).  Аналогично для subject и auditorium

"    self.teacher = teacher" - в поле teacher сохраняется преподаватель занятия
"    self.subject = subject" - в поле subject сохрянется предмет занятия
"    self.auditorium = auditorium" - в поле auditorium сохряняется аудитория занятия
"    Lesson.lessons.append(self)" - новосозданный объект класса Lesson добавляется (append) в массив Lesson.lessons

Последующие строки к классу Lesson не имеют отношения.  Это видно по тому, что отступ строки 'if __name__ == "__main__":' совпадает с отступом строки "class Lesson"
« Последнее редактирование: 04-12-2007 21:24 от Алексей1153++ » Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Angela
Гость
« Ответ #8 : 20-03-2006 19:47 » 

Спасибочки! Дальше постараюсь сама. А если что-то не пойму, надеюсь, что подскажете.
Записан
npak
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #9 : 21-03-2006 10:16 » 

Пожалуйста Улыбаюсь
Записан

UniTesK -- индустриальная технология надежного тестирования.

http://www.unitesk.com/ru/
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines