Я наткнулся на фрагмент кода в Освоении объектно-ориентированного Python.

Я не понимаю синтаксис строки 2. Я понимаю, что rank_str - это словарь. Что такое синтаксис class _, и что он делает?

Другая часть, которую я не понимаю, находится в строке 8. Если class_ - это класс, тогда почему suit нужен в конструкторе, когда он никогда не упоминается? Это потому, что классы * Card имеют его как параметр в своих конструкторах?

1. def card( rank, suit ):
2.    class_, rank_str= {
3.        1:  (AceCard,'A'),
4.        11: (FaceCard,'J'),
5.        12: (FaceCard,'Q'),
6.        13: (FaceCard,'K'),
7.        }.get(rank, (NumberCard, str(rank)))
8.    return class_( rank_str, suit )

Ответы (2)

Специального синтаксиса нет.class_ - это просто переменная. В итоге он будет ссылаться на один из классов AceCard, FaceCardили NumberCard из-за вызова диктовки get метод. Итак, class_ (rank_str, suit) аналогично вызову AceCard (rank_str, suit)или FaceCard (rank_str, suit) или NumberCard (rank_str , костюм) (в зависимости от того, какой класс выбран для данного входа).

Оценка в строке 2 такая же, как a, b = 1, 2. Это присвоение двух переменных за одно присваивание. (Два значения взяты из dict. Вы можете видеть, что каждое значение в dict представляет собой кортеж из двух элементов.)

Если class_ - это класс, то зачем нужен костюм в конструкторе, когда он никогда не упоминается? Это потому, что классы * Card имеют его как параметр в своих конструкторах?

Да.

Все значения в безымянном словаре представляют собой кортежи из двух значений. Если rank соответствует одному из ключей в нем, каждой переменной class_ и rank_str будет присвоено соответствующее значение кортежа. В противном случае им будет присвоен класс NumberCard и str (rank) - так что это значения по умолчанию.

Наконец, функцияcard () затем возвращает результат вызова класса, назначенного переменной class_, и передачи ему текущих значений rank_str иподходит в качестве аргументов.

2022 WebDevInsider