@CrazyPanda210510

Как разобраться с классами в Питоне?

Вопрос новичка.

Пытаюсь разобраться с классами и не мoгу понять в каких случаях надо добавлять self, а когда нет. Почему values и suits вызывают как объект, а deck в random.shuffle(deck) не как объект, а как простую переменную. Я смысл self понимаю но не немогу разобраться с правилами употребления.
Помогите пожалуйста

import random
import Stack

class Acess:
     values = {"2": 2, "3": 3, "4": 4, "5": 5, "6": 6, "7": 7, "8": 8,
              "9": 9, "10": 10, "J": 11, "Q": 12, "K": 13, "A": 14}
    suits =("\u2660", "\u2666", "\u2663", "\u2665")

   
    def create_suffed_deck(self):
        deck = [(suit, value) for suit in self.suits for value in self.values]
        random.shuffle(deck)
        return deck
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
longclaps
@longclaps
random.shuffle определён в модуле random и не принадлежит к числу методов класса list, каковые перечислены здесь. Так сложилось исторически.

Итак, self обычно возникает, когда ты сам создаёшь класс и его методы. При использовании класса self не нужен, баста.

С другой стороны, смотри: вот метод list.reverse()
l = [1, 2, 3]
l.reverse() # [3, 2 ,1]
это очень похоже на то, что делал random.shuffle, но сейчас сделаем совсем неотличимо:
l = [1, 2, 3]
list.reverse(l) # [3, 2 ,1]

да, где-то там в потрохах стандартной библиотеки описан класс list, у которого есть метод reverse(), но нет метода shuffle(). Поэтому ты можешь обратиться к первому в синтаксисе l.reverse(), а ко второму не можешь. Но в другом синтаксисе, class.method(instance) ты можешь обратиться и к одному, и ко второму! Это, кстати, благодаря тому, что модуль тоже класс, как и многое в питоне, а описанные в модуле функции - атрибуты модуля.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
sanya84
@sanya84
Фанатик Python 3
Как говорит господин longclaps, у типа данных list нет метода shuffle, но это легко исправить.

import random


class List(list):
    def __init__(self, values=[]):
        super().__init__(values)
    def shuffle(self):
        random.shuffle(self)
        
def main():
    array = List([i for i in range(20)])
    print(f"Массив как есть: {array}")
    array.shuffle() # перетасовываем
    print(f"Перемешанный массив {array}")

if __name__ == '__main__':
    main()
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы