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

    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()
    Ответ написан
    4 комментария
  • Как разобраться с классами в Питоне?

    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 комментарий