Вход | Регистрация

Трета задача

  • Thumbs_up

    Какво значи "статичен атрибут " ?

    • от "статични атрибути" е, i, j, k на класа:

    Quaternion.e # Quaternion(1, 0, 0, 0) Quaternion.i # Quaternion(0, 1, 0, 0) Quaternion.j # Quaternion(0, 0, 1, 0) Quaternion.k # Quaternion(0, 0, 0, 1)

    02.04.2009 (променeно 02.04.2009)
  • Thumbs_up

    Да има "атрибут" vector, които e Quaternion от векторната част: Quaternion(1, 2, 3, 4).vector # Quaternion(0, 2, 3, 4)

    Може ли да има неща от вида: Quaternion(1, 2, 3, 4).vector.vector # Quaternion(0, 2, 3, 4) или Quaternion(1, 2, 3, 4).vector.scalar # 0

    02.04.2009
  • Thumbs_up

    А защо да няма? Ясно е казано в условието, че vector дава кватернион.

    02.04.2009
  • Thumbs_up

    Ами защото го бях написал тъпо и имаше значение. Сега вече няма :)

    02.04.2009
  • Thumbs_up

    Какво значи "статичен атрибут " ?

    Следните неща да работят:

    x = Quaternion.e
    # след това x e Quaternion(1, 0, 0, 0)
    x = Quaternion.e + Quaternion.i
    # след това x e Quaternion(1, 1, 0, 0)

    Ако примерния тест минала би следвало да си ок.

    02.04.2009
  • Искам да питам има ли значение дали в 1+2i+0j+9k пред нулата ще стои плюс или минус, защото стринга с плюс няма да е еквивалентен на стринга с минус. Питам, защото по принцип не би трябвало да има значение кой от двата знака ще е пред нулата.

    03.04.2009
  • Thumbs_up

    По принцип да, но за предпочитане е +.

    03.04.2009
  • Thumbs_up

    Винаги + или когато е зададено с Quaternion(2-0j, 3+4j) да върне стринга с -

    03.04.2009
  • Thumbs_up

    Винаги + или когато е зададено с Quaternion(2-0j, 3+4j) да върне стринга с -

    Няма значение - float('0') == float('+0') == float('-0').

    Не е валидно обаче - '+-0+-0i+-0j+-0k' (т.е. по 2 знака).

    03.04.2009
  • Thumbs_up

    (a + bj).real връща винаги float. Т.е. за мене

    (1, 2, 3, 4) != Quaternion( 1+2j, 3+4j ).tuple()

    Аз ли бъркам нещо с операциите с комплексни числа (това ли е правилното поведение в случая)?

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_up

    (a + bj).real връща винаги float

    Това не е проблем:

    >>> (1, 2, 3, 4) == (1.0, 2.0, 3.0, 4.0)
    True

    (1, 2, 3, 4) != Quaternion( 1+2j, 3+4j ).tuple()

    (1, 2, 3, 4) == Quaternion( 1+2j, 3+4j ).tuple()

    Ако теста не ти минава значи бъркаш нещо.

    03.04.2009
  • Oops... Sorry, my bad :)

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_up

    В теста има една некоректност, свързана със следната част от задачата:

    Координатите да могат да се достъпват с [i]:

    q = Quaternion(1, 2, 3, 4)

    (q[0], q[1], q[2], q[3]) # (1, 2, 3, 4)

    Теста не проверява това, той проверява дали q има метод __getitem__, по-точно дали има достъп до този метод. По стечение на обстоятелствата при мен този метод е скрит(пренаписал съм __getattribute__) и => q.__getitem__(1) не работи, но q[1] работи както се очаква.

    Разбирасе не е проблем да го "покажа", но това не се изисква от условието на задачата.

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_upThumbs_up

    Един път ли трябва да се дефинира __init__ в класа, защото ако го дефинирам веднъж за Quaternion(self) и веднъж за Quaternion(self, r), например - гърми. Аз ли не разбирам или бъркам нещо?

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_upThumbs_up

    В Python няма претоварване, т.е. само последният метод с дадено име важи. Ако искаш конструктор, който да обхваща всичко, трябва да проверяваш колко и какви аргументи приемаш.

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_up

    Да мерси. Схванах че бачка само последното . Сега ще мисля поне в правилната посока. Значи трябва да проверявам, дали са комплексни, дали съм подал масив от координати, само в един __init__ , така ли?

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_up

    Точно.

    03.04.2009
  • Thumbs_up

    Имам малък проблем със статичните атрибути, а именно, че не знам как да върна обект от тип Quaternion при извикване на Quaternion.e. Ако ги сложа в конструктора по този начин self.__class__.e = Quaternion(1,0,0,0) - се получава безкрайна рекурсия. Ако ги сложа извън него с e = Quaternion(1,0,0,0) - казва, че не е дефинирано Quaternion. Ще се радвам, ако ми подскажете малко. :)

    03.04.2009
  • Thumbs_up

    (т.к. разни хора питаха, решихме да подскажем малко)

    HINT:

    Не е задължително на направите "статичните полета" на Quaternion е, i, j, k по > време на създаване на класа.

    ...каза Точо, по-рано в тази тема. :)

    03.04.2009
  • Thumbs_up

    Хмм, окей, аз реших, че "по време на създаване на класа" значи да не е в конструктора, но поне в тялото на класа.

    П.П. От това "не е задължително" изглежда, че има начин и там да бъде.

    Edit: Сега загледах, че с vector въпросът е подобен - атрибут връща обект от типа на класа. Как да процедирам с него?

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_upThumbs_up

    [POST MUTED]

    Поста беше счетен за прекалено информативен.

    (плюс това има други начини за имплементиране и идеята е всеки сам да си го измисли...)

    03.04.2009 (променeно 03.04.2009)
  • Thumbs_up

    Хаха, как можах да не се сетя. Много благодаря. Току-що го направих.

    03.04.2009
  • Thumbs_up

    @Иван Живков

    Можеш ли да сложиш като коментар в кода, който си предал, как правиш това без getitem да работи?

    Сещам се за начин да постигнеш q[0] да не работи, но q.__getitem__(0) да работи, но за обратното с текущия материал... (но може - не мисля добре в 01:00 след като съм станал в 06:00 :) )

    (Все пак да си предупредя, да не стават грешки, не поствай кода на форумите :) )

    04.04.2009 (променeно 04.04.2009)
  • аз да питам може би нещо глупаво, но май блокирах:
    това a = Quaternion(1, 1, 1, 1)
    a / 2 # Quaternion(0.5, 0.5, 0.5, 0.5) прави следното:
    Quaternion(a.e/2, a.i/2, a.j/2, a.k/2) ... така ли е? :(

    04.04.2009 (променeно 04.04.2009)
  • Thumbs_up

    a / 2 # Quaternion(0.5, 0.5, 0.5, 0.5) прави следното: Quaternion(a.e/2, a.i/2, a.j/2, a.k/2) ... така ли е? :(

    Да

    04.04.2009