Трета задача

  1. Имам въпрос относно реализацията на CardCollection и по точно относно това че в няколко от примерните тестове има:

    deck = CardCollection...
    ...len(deck)...
    

    Може ли да предефинираме:

     __str__()
    

    за класа или щом не е споменато изрично в условието, нямаме това право и трябва да правим други "магии" че да сработи ?

  2. Лично за мен да предефинираш _ _str__ () е като да предефинираш toString () в java-та. Тоест ако искаш да имаш отпечатване на обекта, то си е задължително. Друго което ме интересува е има ли някаква конвенция или добра практика за писането на Python в по-голям проект. Да четох по-въпроса, но не намерих информация за това в заданието.

  3. @Йосиф len(obj) е еквивалентно на obj.__len__(). Това е стандартният начин да се разбере големината на колекция.

    Да, __str__ e като .toString() в Java. str(obj) ще извика obj.__str__(). В условието е указано, че е задължително да сe дефинира това поведение за някои класове.

  4. За 1 разгледай, за да се оринтираш: print ("Ace.dict:"+ Ace.dict)

    За 2 зависи си от имплементацията:

    import operator x = {1: 2, 3: 4, 4:3, 2:1, 0:0} sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))

    За 3- да, според мен това е _ _str__ на обекта ти, в случая 13-тата карта в тестето. Но например ако имаш по-малко карти трябва да ти върне IndexError: list index out of range

  5. Аз също искам да попитам какви точно колекции да очакваме, и ако очакваме речник, в какъв формат ще са данните в него? Освен това искам да попитам наредбата на картите в тестето точно Diamonds, Clubs, Hearts, Spades ли трябва да е? Защото, доколкото знам, по принцип картите се нареждат Clubs, Diamonds, Hearts, Spades...

  6. @Стефани, StandardDeck връща CardCollection. В тестовете подаваме на CardCollection само list.

    @Георги точната подредба е указана в края на условието. Купих си едно тесте карти "Club Special No 92" и подредбата им беше такава :). Имай в предвид че индекс 0 на колекцията е най-долната карта в тестето. Най-горната е Ace of Spades и е последна в колекцията.

    Между другото Пика на английски е Spades. Малко е объркващо.

  7. Здрасти,

    В условието не са уточнени всички символи на ранкове какви трябва да бъдат ? Предположил съм че са както следва:

    (('King', 'K'), ('Queen', 'Q'), ('Jack' , 'J'), ('Ten', 'T'),
     ('Nine', '9'), ('Eight', '8'), ('Seven', '7'), ('Six', '6'),
     ('Five', '5'), ('Four' , '4'), ('Tree' , '3'), ('Two', '2'),
     ('Ace' , 'A'))
    

    Това ОК ли е ?

  8. @Цветелина След като са символи бях решил че трябва да са низове с по един елемент всички. Благодаря за уточнението. Всъщност имаш предвид низа '10' a не числото 10 нали ?

    Също така в условието не се казва никъде че на колекцията от карти трябва да може да се вземе дължината с len, както и че тя трябва да може да се инстанциира без подадена колекция на конструктора. Това става ясно само от примерния тест. Още не се уточнява какво трябва да е поведението ако при индексиране на дека се опита да се подмени карта в него.

  9. @Иван, не ни интересува подмяната на картите засега, но по принцип колекцията от карти е замислена да е mutable. Тя може да моделира както тесте, така и ръка карти на играч например.

    Иначе по принцип приемайте примерните тестове като част от условието. За len специално не е указано в условието защото на лекция казахме, че колекция представлява нещо което може да се индексира с [] и има имплементиран __len__.

  10. Няколко допълнителни теста.
    Имайте предвид, че тези очакват TypeError при опит да се промени Card класът (по условие е immutable),
    а не AttributeError(както е в примера) тъй като това е конвенционалното поведение за immutable обекти(например string).
    Проверява се и дали е възможно изтриването на атрибути.

  11. Да, Людмил е писал, че в тестовете ще подават само лист, но в условието пише:
    Конструктора на Card пиема каквато и да е колекция от инстанции на Card като начални данни. (не е от мен правописната грешка :) ).
    Освен това не знам защо да има значение каква колекция се подава, предвид, че по нея може да се итерира.

  12. @Виктор

    1. Не е задължително
    2. Не е задължително, но всички класове имат конструктор, защото наследяват object по подразбиране.

      >>> class Test: pass
      ... 
      >>> Test.__init__
      <slot wrapper '__init__' of 'object' objects>
      >>> Test.__bases__
      (<class 'object'>,)
      
  13. "Конструктора на Card пиема каквато и да е колекция от инстанции на Card като начални данни"

    трябва да е "Конструктора на CardCollection" в условието

    ПП: от този пример:

    StandardDeck() [, , , , .........

    да разбираме ли че трябва да предефинираме и repr на CardCollection?

Трябва да сте влезли в системата, за да може да отговаряте на теми.