Наследование от класса str - PullRequest
1 голос
/ 09 июля 2020

Я python новичок ie и, возможно, уже задавал много глупых вопросов, пожалуйста, простите меня. Я видел следующий код python для сортировки строк, и он работает очень хорошо. Но я сам не могу понять, как это работает. Я понимаю, что класс Predicate наследует класс str и перегружает метод объекта __lt__ (<), который позже используется в функции <code>sorted для проведения сортировки.

## code 1 ##
class Predicate(str):
    def __lt__(self, other):
        print(self, other)
        return self + other < other + self

list_ = ['3', '30', '34', '5', '9']
sorted(list_, key=Predicate, reverse=True)

output:
['30', '3', '34', '5', '9']

Однако здесь вот чего я не понимаю: когда я вызываю Predicate(3), он возвращает "3", как этот процесс работает? Я ожидаю, что это будет примерно так:

## code 2 ##
class MyString(str):
    def __init__(self, x):
        self=str.__init__(x)
    def __lt__(self, other):
        return self + other < other + self

Поскольку я не использовал метод __new__ или __init__, как в этом сообщении . Я хочу точно знать, как ввод 3 передается в класс Predicate() и как "3" генерируется и возвращается в коде 1 ? Я также пытаюсь заглянуть в str class исходный код , но он находится в c и может быть для меня слишком сложным. Может ли кто-нибудь помочь мне с перевариванием наследования str в Predicate и процессом инициализации? Очень благодарен за вашу помощь и образование.

1 Ответ

2 голосов
/ 09 июля 2020

"3", которое вы видите, когда вы вызываете Predicate(3), на самом деле не результат вызова, это repr результата. Если вы сохраните его в переменной с чем-то вроде p = Predicate(3), вы сможете проверить, что type(p) равно Predicate. Он имеет то же repr, что и строка, потому что вы не переопределили метод __repr__ в классе (и действительно, вам это действительно не нужно, поскольку обычно вы не собираетесь хранить экземпляры Predicate вокруг ).

Вот почему в первую очередь приемлемо целочисленное значение для построения Predicate. Вы наследуете str.__new__ (не __init__, потому что строки неизменяемы в Python), а str(3), что неудивительно, создает строку "3". Экземпляр p, который мы создаем с помощью Predicate(3), почти совпадает со строкой "3". Он имеет тот же repr, и большинство других методов ведут себя так же. Но у него есть собственный метод обработки оператора <, поэтому он полезен как ключ сортировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...