Какво значи "статичен атрибут " ?
- от "статични атрибути" е, 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)
Какво значи "статичен атрибут " ?
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)
Да има "атрибут" 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
А защо да няма? Ясно е казано в условието, че vector дава кватернион.
Ами защото го бях написал тъпо и имаше значение. Сега вече няма :)
Какво значи "статичен атрибут " ?
Следните неща да работят:
x = Quaternion.e
# след това x e Quaternion(1, 0, 0, 0)
x = Quaternion.e + Quaternion.i
# след това x e Quaternion(1, 1, 0, 0)
Ако примерния тест минала би следвало да си ок.
Искам да питам има ли значение дали в 1+2i+0j+9k пред нулата ще стои плюс или минус, защото стринга с плюс няма да е еквивалентен на стринга с минус. Питам, защото по принцип не би трябвало да има значение кой от двата знака ще е пред нулата.
По принцип да, но за предпочитане е +.
Винаги + или когато е зададено с Quaternion(2-0j, 3+4j) да върне стринга с -
Винаги + или когато е зададено с Quaternion(2-0j, 3+4j) да върне стринга с -
Няма значение - float('0') == float('+0') == float('-0')
.
Не е валидно обаче - '+-0+-0i+-0j+-0k'
(т.е. по 2 знака).
(a + bj).real
връща винаги float. Т.е. за мене
(1, 2, 3, 4) != Quaternion( 1+2j, 3+4j ).tuple()
Аз ли бъркам нещо с операциите с комплексни числа (това ли е правилното поведение в случая)?
(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()
Ако теста не ти минава значи бъркаш нещо.
Oops... Sorry, my bad :)
В теста има една некоректност, свързана със следната част от задачата:
Координатите да могат да се достъпват с [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]
работи както се очаква.
Разбирасе не е проблем да го "покажа", но това не се изисква от условието на задачата.
Един път ли трябва да се дефинира __init__ в класа, защото ако го дефинирам веднъж за Quaternion(self) и веднъж за Quaternion(self, r), например - гърми. Аз ли не разбирам или бъркам нещо?
В Python няма претоварване, т.е. само последният метод с дадено име важи. Ако искаш конструктор, който да обхваща всичко, трябва да проверяваш колко и какви аргументи приемаш.
Да мерси. Схванах че бачка само последното . Сега ще мисля поне в правилната посока. Значи трябва да проверявам, дали са комплексни, дали съм подал масив от координати, само в един __init__ , така ли?
Точно.
Имам малък проблем със статичните атрибути, а именно, че не знам как да върна обект от тип Quaternion при извикване на Quaternion.e. Ако ги сложа в конструктора по този начин self.__class__.e = Quaternion(1,0,0,0) - се получава безкрайна рекурсия. Ако ги сложа извън него с e = Quaternion(1,0,0,0) - казва, че не е дефинирано Quaternion. Ще се радвам, ако ми подскажете малко. :)
(т.к. разни хора питаха, решихме да подскажем малко)
HINT:
Не е задължително на направите "статичните полета" на Quaternion е, i, j, k по > време на създаване на класа.
...каза Точо, по-рано в тази тема. :)
Хмм, окей, аз реших, че "по време на създаване на класа" значи да не е в конструктора, но поне в тялото на класа.
П.П. От това "не е задължително" изглежда, че има начин и там да бъде.
Edit: Сега загледах, че с vector въпросът е подобен - атрибут връща обект от типа на класа. Как да процедирам с него?
[POST MUTED]
Поста беше счетен за прекалено информативен.
(плюс това има други начини за имплементиране и идеята е всеки сам да си го измисли...)
Хаха, как можах да не се сетя. Много благодаря. Току-що го направих.
@Иван Живков
Можеш ли да сложиш като коментар в кода, който си предал, как правиш това без
getitem
да работи?
Сещам се за начин да постигнеш q[0]
да не работи, но
q.__getitem__(0)
да работи, но за обратното с текущия материал...
(но може - не мисля добре в 01:00 след като съм станал в 06:00 :) )
(Все пак да си предупредя, да не стават грешки, не поствай кода на форумите :) )
аз да питам може би нещо глупаво, но май блокирах:
това 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) ... така ли е? :(
a / 2 # Quaternion(0.5, 0.5, 0.5, 0.5) прави следното: Quaternion(a.e/2, a.i/2, a.j/2, a.k/2) ... така ли е? :(
Да