Список встроенной функции или класса в python 3 - PullRequest
0 голосов
/ 07 апреля 2020
>>> print(list(map(list,"abcde")))
[['a'],['b'],['c'],['d'],['e']]

Выше приведен наиболее вероятный и правильный ответ, однако я подумал об этом немного по-другому.

Поскольку для map требуется функция в качестве первого параметра, а list является правильным классом, поэтому как карта работает?

Однако я слышал о списке как о встроенной функции, которая возвращает объект списка. Только класс может вернуть объект, который является ничем иным, как созданием объекта. Но если это класс, то список должен был быть написан в Camelcase в соответствии с соглашением об именах классов в python, что не так.

Все вышеперечисленные пункты приводят меня к конфликту, что список является класс или метод в python?

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

list - это встроенный класс в Python. Однако классы могут вызываться так же, как и функции, а при их вызове классы создают и возвращают объекты, поэтому вы можете передать класс в качестве аргумента, где ожидается функция (или, если быть точным, вызываемая).

0 голосов
/ 07 апреля 2020

Спасибо за такое глубокое объяснение. Однако я все еще немного сбит с толку. Из приведенного выше обсуждения я понял, что карта ожидает вызываемого объекта, не ограничивая его только функциями, но целой семьей, если она вызывается. Исходя из моего опыта, у меня есть ощущение, что все классы являются вызываемыми, и именно так они правильно создают объекты. Так почему же он не работает с пользовательскими классами (см. Код ниже). Можете ли вы также объяснить мне, почему он выдает ошибку?

Код загружен на github вместе с ошибкой: https://github.com/Git101pt/Callables.git

0 голосов
/ 07 апреля 2020

Так как map требуется функция в качестве первого параметра, а list является правильным классом, то как работает карта?

map() нуждается в вызываемой как Первый параметр Вы можете определять пользовательские вызываемые типы в Python, а классы Python действительно являются вызываемыми объектами.

Однако я слышал и о списке как о встроенной функции, которая возвращает объект списка.

Довольно много встроенных типов действительно все еще задокументированы как функции (какими они были через 1.x дней, если я правильно помню).

Только класс может вернуть объект

О, да? Это будет означать, что, поскольку все в Python является объектом, функции не могут ничего возвратить - даже объект None singleton; -)

, который является ничем иным, как созданием объекта. Но если это класс, то список должен быть написан в Camelcase в соответствии с соглашением об именах классов в python, что не так.

То же, что и выше - довольно много встроенных типов называются функциями, в основном по историческим причинам. И есть случаи, когда имеет смысл не следовать соглашениям об именах, даже в вашем собственном коде. Например, декораторы, принимающие аргументы, могут быть определены как дважды вложенные функции или как вызываемые классы. Если ваш модуль сначала определил декоратор как функцию, то по какой-либо причине (читабельность, тестируемость и т. Д.) Вы решите изменить реализацию на вызываемый класс, вы, конечно же, не захотите нарушать код клиента, переименовывая его в CamelCase.

На самом деле, весь смысл наличия одного и того же механизма для вызова функций или экземпляров классов состоит в том, чтобы позволить заменять один другим другим, не нарушая клиентский код - еще одно применение наиболее важной функции ОО: polymorphi c dispatch.

Все вышеперечисленные пункты приводят меня к конфликту, что список - это класс или метод в python?

Это класс, определенно. Вы можете просто проверить это в вашей python оболочке:

Python 3.6.9 (default, Nov  7 2019, 10:44:02) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> type(list)
<class 'type'>
>>> type(dict)
<class 'type'>
>>> type(property)
<class 'type'>
>>> type(type)
<class 'type'>
>>> type(len)
<class 'builtin_function_or_method'>
>>> 
...