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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Знатоки Питона, помогите  (Прочитано 11045 раз)
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 » new

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

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

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines