Третото ви задание вече е публикувано. Имате една седмица за него. Отново напомняме как да (не) си изпращате задачите.
Примерния тест можете да намерите в GitHub хранилището.
Третото ви задание вече е публикувано. Имате една седмица за него. Отново напомняме как да (не) си изпращате задачите.
Примерния тест можете да намерите в GitHub хранилището.
Имам въпрос относно реализацията на CardCollection и по точно относно това че в няколко от примерните тестове има:
deck = CardCollection...
...len(deck)...
Може ли да предефинираме:
__str__()
за класа или щом не е споменато изрично в условието, нямаме това право и трябва да правим други "магии" че да сработи ?
Мисля, че може да го предефиниране, а това, че не е споменато в условието може би значи, че не искат да ни подсказват...
Лично за мен да предефинираш _ _str__ ()
е като да предефинираш toString () в java-та. Тоест ако искаш да имаш отпечатване на обекта, то си е задължително. Друго което ме интересува е има ли някаква конвенция или добра практика за писането на Python в по-голям проект. Да четох по-въпроса, но не намерих информация за това в заданието.
@Йосиф len(obj)
е еквивалентно на obj.__len__()
. Това е стандартният начин да се разбере големината на колекция.
Да, __str__
e като .toString()
в Java. str(obj)
ще извика obj.__str__()
. В условието е указано, че е задължително да сe дефинира това поведение за някои класове.
>>> str(RANKS"Ace")
Ace
не връща ли стринг?
На CardCollection може ли да се подаде нещо различно от list, set, tuple? (dict май отпада заради липса на наредба на елементите?)
Edit: Това, което връща StandardDeck()
от тип CardCollection
ли е ?
За 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
Аз също искам да попитам какви точно колекции да очакваме, и ако очакваме речник, в какъв формат ще са данните в него? Освен това искам да попитам наредбата на картите в тестето точно Diamonds, Clubs, Hearts, Spades ли трябва да е? Защото, доколкото знам, по принцип картите се нареждат Clubs, Diamonds, Hearts, Spades...
@Стефани, StandardDeck
връща CardCollection
. В тестовете подаваме на CardCollection само list.
@Георги точната подредба е указана в края на условието. Купих си едно тесте карти "Club Special No 92" и подредбата им беше такава :). Имай в предвид че индекс 0 на колекцията е най-долната карта в тестето. Най-горната е Ace of Spades и е последна в колекцията.
Между другото Пика на английски е Spades. Малко е объркващо.
Благодаря ти за отговора. Е, аз не съм страстен картоиграч и затова реших да попитам каква е подредбата (ако изобщо има общоустановена такава).
И аз си мислех че е както ти каза, обаче все пак реших да видя дали има стандарт :)
Малко глупав въпрос:
От примера на задачата, StandartDeck() трябва да върне:
[<Card King of Diamonds>, <Card Queen of Diamonds>...
проблем ли ако върне:
['Card King of Diamonds', 'Card Queen of Diamonds'...
@Цветелина няма значение какво връща, това няма да се проверява. Връща е защото съм направил __repr__
да е различен от __str__
на класа Card, но това е по желание.
Здрасти,
В условието не са уточнени всички символи на ранкове какви трябва да бъдат ? Предположил съм че са както следва:
(('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'))
Това ОК ли е ?
@Людмил, благодаря :)
@Иван трябва да са това с едно изключение : 'Ten': 10, a не 'T'
Тук има картинка на символите на ранговете
@Цветелина След като са символи бях решил че трябва да са низове с по един елемент всички. Благодаря за уточнението. Всъщност имаш предвид низа '10'
a не числото 10
нали ?
Също така в условието не се казва никъде че на колекцията от карти трябва да може да се вземе дължината с len
, както и че тя трябва да може да се инстанциира без подадена колекция на конструктора. Това става ясно само от примерния тест. Още не се уточнява какво трябва да е поведението ако при индексиране на дека се опита да се подмени карта в него.
@Иван, да имах предвид '10'. За индексирането - не би трябвало да може да подменя карти, все пак правим карти за игра, а на белот/сантасе/... няма как да си вкарваме карти в тестето, когато си искаме :)
@Иван, не ни интересува подмяната на картите засега, но по принцип колекцията от карти е замислена да е mutable. Тя може да моделира както тесте, така и ръка карти на играч например.
Иначе по принцип приемайте примерните тестове като част от условието. За len
специално не е указано в условието защото на лекция казахме, че колекция представлява нещо което може да се индексира с []
и има имплементиран __len__
.
А ако на CardCollection се подаде tuple тогава какво правим с draw и add ? Конвертираме и махаме или...
Вчера Людмил е написал:
@Стефани, StandardDeck връща CardCollection. В тестовете подаваме на CardCollection само list.
Имаше лек glitch в примерния тест. Поправката е налична в github.
class Rank:
def __int__(self, symbol_):
self.symbol = symbol_
class Two(Rank):
def __init__(self):
Rank.__init__(self, '2')
dvoika = Two()
Това - гърми.. защо ?
@Константин, вместо __init__
в конструктора на Rank си написал __int__
.
str(RANKS["Ace"]())
не трябва ли да връща низ, в смисъл 'Ace', а не Ace?Rank
и Suit
трябва ли да могат да се инстанцират, т.е. трябва ли за тях да има дефиниран конструктор?
Няколко допълнителни теста.
Имайте предвид, че тези очакват TypeError
при опит да се промени Card
класът (по условие е immutable),
а не AttributeError
(както е в примера) тъй като това е конвенционалното поведение за immutable обекти(например string).
Проверява се и дали е възможно изтриването на атрибути.
@Божидар, в тестовете ти на CardCollection подаваш set, който е генериран от random_cards(), а аз доколкото разбрах на CardCollection ще се подава само list от тестовете или се бъркам?
Да, Людмил е писал, че в тестовете ще подават само лист, но в условието пише:
Конструктора на Card пиема каквато и да е колекция от инстанции на Card като начални данни. (не е от мен правописната грешка :) ).
Освен това не знам защо да има значение каква колекция се подава, предвид, че по нея може да се итерира.
@Виктор
Не е задължително, но всички класове имат конструктор, защото наследяват object по подразбиране.
>>> class Test: pass
...
>>> Test.__init__
<slot wrapper '__init__' of 'object' objects>
>>> Test.__bases__
(<class 'object'>,)
Ако се предефинира __repr__
на Rank. aos.rank
вече не връща
<__main__.Ace object at 0x7f2632ed5890>
, а името. С това има ли проблем ?
Не, __repr__
се предефинира главно за да ти е по-лесно с дебъгването. Направи си го както ти харесва.
"Конструктора на Card пиема каквато и да е колекция от инстанции на Card като начални данни"
трябва да е "Конструктора на CardCollection" в условието
ПП: от този пример:
StandardDeck() [, , , , .........
да разбираме ли че трябва да предефинираме и repr на CardCollection?
Трябва да сте влезли в системата, за да може да отговаряте на теми.