Про методы ч.1
Про методы
Метод. В пайтоне всё объект. Эти объекты можно различать по типам. Но порой с каким-то из объектов (нужного нам типа) нужно что-то сделать. То есть произвести некие действия, а действия это по факту функция. То есть метод - это функция завязанная на определенном типе объекта (например строки). У каждого объекта есть свой тип, а у этого типа свой метод.
Например, есть объекты - стаканы. Для начала нам нужно их отличить. Отличить их можно по типу - те стеклянный, пластиковый, железный. То есть в их составе (пластик, метал, железо или числа, строки. Вообще вот основные типы данных для любого языка (хотя я это вставил немного перепутав с типами объектов и в этом я разберусь ниже)
У каждого типа данных свои методы и соответственно к ним применимы разные действия.
Вообще, есть вот такое определение метода..
Метод - это функция, которая является членом класса...
#Если я правильно понял, то я размышлял до этого над стаканами. Так вот стакан может быть классом, над которым можно сделать действия - это значит произвести функцию. Но, мы не можем делать одинаковые действия над разными типами данных... То есть мы не можем налить сильно горячую воду в пластиковый стакан, он расплавится, для этого подойдет металлический или стеклянный, но в тоже время мы не можем кинуть стеклянный стакан, он разобьется, зато пластиковый и металлический можем.. В этом и суть метода.
Или вот: Метод – это функция, которая принимает экземпляр класса как свой первый параметр.
P.S. ну тут я не очень понял.
Также методы бывают связанными и не связанными.
1) Связанные методы – это методы, относящиеся к экземплярам класса. В этом примере instance.method привязан к экземпляру с именем instance . Каждый раз, когда этот связанный метод вызывается, экземпляр self передается в качестве первого параметра – который называется self по соглашению.
2) Когда вы C.method к C.method (метод внутри класса, а не внутри экземпляра), вы получаете несвязанный метод. Если вы хотите вызвать его, вам необходимо передать экземпляр в качестве первого параметра, потому что метод не привязан к какому-либо экземпляру.
Зная эту разницу, вы можете использовать функции / методы как объекты, например, методы передачи. В качестве примера используйте случай, представьте API, который позволяет определить функцию обратного вызова, но вы хотите предоставить метод в качестве функции обратного вызова. Нет проблем, просто передайте self.myCallbackMethod как обратный вызов, и он будет автоматически вызван с экземпляром в качестве первого аргумента. Это было бы невозможно в статических языках, таких как C ++ (или только с обманом).
Надеюсь, у вас есть смысл;) Я думаю, что это все, что вам нужно знать об основах метода. Вы также можете прочитать о декораторахclassmethodиstaticmethod, но это еще одна тема.
Вот отличный пример:
Формат для вызова метода: object_name.method_name() , и любые аргументы метода перечислены в круглых скобках. Метод неявно действует на имя объекта, и поэтому некоторые методы не имеют никаких утвержденных аргументов, поскольку сам объект является единственным необходимым аргументом. Например, my_string.upper() не имеет никаких перечисленных аргументов, потому что единственным обязательным аргументом является сам объект my_string
Вот классная мысль в которой я постоянно путался:
import math
a = math.sqrt(81)
print (a)
Является ли sqrt методом math?
Ответ:нет
Тут мы вызываем функцию sqrt которая принадлежит модулю math. А что такое модуль мы поговорим позже..
Так в чем же разница вызовово между методов и функцией?
МЕТОД: object_name.method_name()
ФУНКЦИЯ: module_name.function_name()
Важная мысль, но я ее пока не особо понял:
единственный способ различать два формата (визуально) – это посмотреть в остальной части кода и посмотреть, определена ли часть до периода ( math , my_list , my_string ) как объект или модуль.
Ещё раз:
Метод = это функция, которая является членом класса.
А тут я нихуя не понял, но очень интересно ))
Вот пример функции, которая становится членом класса. С тех пор он ведет себя как метод класса. Начнем с пустого класса и нормальной функции с одним аргументом:
>>> class C: ... pass ... >>> def func(self): ... print 'func called' ... >>> func('whatever') func called
Теперь мы добавляем элемент в класс C , который является ссылкой на функцию. После этого мы можем создать экземпляр класса и вызвать его метод, как если бы он был определен внутри класса:
>>> C.func = func >>> o = C() >>> o.func() func called
Мы также можем использовать альтернативный способ вызова метода:
>>> C.func(o) func called
o.func даже проявляется так же, как метод класса:
>>> o.func <bound method C.func of <__main__.C instance at 0x000000000229ACC8>>
И мы можем попробовать обратный подход. Давайте определим класс и украдим его метод как функцию:
>>> class A: ... def func(self): ... print 'aaa' ... >>> a = A() >>> a.func <bound method A.func of <__main__.A instance at 0x000000000229AD08>> >>> a.func() aaa
Пока все выглядит так же. Теперь функция кражи:
>>> afunc = A.func >>> afunc(a) aaa
Истина заключается в том, что метод не принимает аргумент «независимо»:
>>> afunc('whatever') Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unbound method func() must be called with A instance as first argument (got str instance instead)
ИМХО, это не аргумент против метода – это функция, которая является членом класса .
Позже нашел ответ Алексея Мартелли, который в основном говорит то же самое. Извините, если вы считаете это дублированием 🙂
От себя.. Если мы используем например метод для строк, то это знчит что никакой метод не изменит данные. Так как строка является неизменяемым типом.
Чтобы это проверить мы можем повторно вывести эту строку на принт и понять что изменений не произошло.
#изменит
s = 'heLLO'.lower()
print (s)
print (s)
Хотя если честно, я пробовал и по другому, везде меняло)) Я так и не понял что нужно сделать чтобы не изменило))
Типы объектов
Вообще вся головная боль зачастую приходит из терминологии. Порой сложно понять вещи которые переводятся зачастую поразному соответственно по разному интерпритируются.
Особенно часто это касается всего, что связанно с типом объекта. Давайте разберемся.
В Python есть две функции type() и isinstance() с помощью которых можно проверить к какому типу данных относится переменная.
- type в переводе на русский ТИП
- instance в переводе экземпляр
Разница между type() и isinstance()
type() возвращает тип объекта
isinstance() возвращает boolean значение - принадлежит объект данному типу или нет/ более точная чем type.
Встроенная функция type() это самый простой способ выяснить тип. Вы можете воспользоваться следующим образом.
a = [1,2,4,90]
print(type(a))
>>
<class 'list'>
Вообще у меня возник вопрос, сколько существует классов в функции type.
До меня малость дошло.... Что каждый тип объекта в пайтоне (int, str, list, tuple и тд) это класс... Я в ахуе. Спасибо этой надписи <class 'list'>
А вот теперь важная инфа.. Что в питоне 14 типов данных (бля, а я думал 4)
- Для начала рассмотрим три численных типа (Numeric Types): int (signed integers)
- float (вещественные числа с плавающей точкой)
- complex (комплексные числа)
В оф документации я вижу 7
В Python есть несколько стандартных типов данных:
- Numbers (числа) #как я понимаю сюда входит int, float, complex
- Strings (строки)
- Lists (списки)
- Dictionaries (словари)
- Tuples (кортежи)
- Sets (множества)
- Boolean (логический тип данных)
Эти типы данных можно, в свою очередь, классифицировать по нескольким признакам:
- изменяемые (списки, словари и множества)
- неизменяемые (числа, строки и кортежи)
- упорядоченные (списки, кортежи, строки и словари)
- неупорядоченные (множества)
ЧТО ЭТО НАМ ДАЕТ.. Это дает, что в изменяемых типах данных можно менять элементы местами, добавлять новые и вложенные элементы (список в списке).
А в упорядочных типах данных можно обращаться по индексу и срезам.
КОРОЧЕ ПОЛНАЯ ИНФА КОТОРУЮ Я ХОТЕЛ ВИДЕТЬ: https://devpractice.ru/python-lesson-3-data-model/
Очень интересная мысль, прежде чем изучать типы данных:
b = 5
объявляет переменную b и присваивает ей значение 5.
Целочисленное значение 5 в рамках языка Python по сути своей является объектом. Объект, в данном случае – это абстракция для представления данных, данные – это числа, списки, строки и т.п. При этом, под данными следует понимать как непосредственно сами объекты, так и отношения между ними (об этом чуть позже). Каждый объект имеет три атрибута – это идентификатор, значение и тип. Идентификатор – это уникальный признак объекта, позволяющий отличать объекты друг от друга, а значение – непосредственно информация, хранящаяся в памяти, которой управляет интерпретатор.
При инициализации переменной, на уровне интерпретатора, происходит следующее:
- создается целочисленный объект 5 (можно представить, что в этот момент создается ячейка и 5 кладется в эту ячейку);
- данный объект имеет некоторый идентификатор, значение: 5, и тип: целое число;
- посредством оператора “=” создается ссылка между переменной b и целочисленным объектом 5 (переменная b ссылается на объект 5).
Имя переменной не должно совпадать с ключевыми словами интерпретатора Python. Список ключевых слов можно найти здесь. Также его можно получить непосредственно в программе, для этого нужно подключить модуль keyword и воспользоваться командой keyword.kwlist.
Типы данных в Python
В Python типы данных можно разделить на встроенные в интерпретатор (built-in) и не встроенные, которые можно использовать при импортировании соответствующих модулей.
К основным встроенным типам относятся:
- None (неопределенное значение переменной)
- Логические переменные (Boolean Type)
- Числа (Numeric Type)int – целое число
- float – число с плавающей точкой
- complex – комплексное число
- Списки (Sequence Type)list – список
- tuple – кортеж
- range – диапазон
- Строки (Text Sequence Type )str
- Бинарные списки (Binary Sequence Types)bytes – байты
- bytearray – массивы байт
- memoryview – специальные объекты для доступа к внутренним данным объекта через protocol buffer
- Множества (Set Types)set – множество
- frozenset – неизменяемое множество
- Словари (Mapping Types)dict – словарь
Кстати, для меня это открытие:
a = 1,2,4,90
что это КОРТЕЖ
Короче, я думаю нет смысла перепечатывать, нужно просто хорошенечко прочитать эти 2 статьи:
Бляяя.. Есть ещё такая хуйня...
Типизация - назначения типа информационным сущностям.
Наиболее распространённые примитивные типы данных:
- Числовой
- Символьный
- Логический
Немного о типизации языков программирования
Если достаточно формально подходить к вопросу о типизации языка Python, то можно сказать, что он относится к языкам с неявной сильной динамической типизацией.
Неявная типизация означает, что при объявлении переменной вам не нужно указывать её тип, при явной – это делать необходимо. В качестве примера языков с явной типизацией можно привести Java, C++. Вот как будет выглядеть объявление целочисленной переменной в Java и Python.
Java:
int a = 1;
Python:
a = 1
Также языки бывают с динамической и статической типизацией. В первом случае тип переменной определяется непосредственно при выполнении программы, во втором – на этапе компиляции (о компиляции и интерпретации кратко рассказано в уроке 2). Как уже было сказано Python – это динамически типизированный язык, такие языки как С, C#, Java – статически типизированные.
Сильная типизация не позволяет производить операции в выражениях с данными различных типов, слабая – позволяет. В языках с сильной типизацией вы не можете складывать например строки и числа, нужно все приводить к одному типу. К первой группе можно отнести Python, Java, ко второй – С и С++.
За более подробным разъяснением данного вопроса советуем обратиться к статье “Ликбез по типизации в языках программирования”.
JavaScript - Динамическая | Слабая | Неявная Ruby - Динамическая | Сильная | Неявная Python - Динамическая | Сильная | Неявная Java - Статическая | Сильная | Явная PHP - Динамическая | Слабая | Неявная C - Статическая | Слабая | Явная C++ - Статическая | Слабая | Явная Perl - Динамическая | Слабая | Неявная Objective-C - Статическая | Слабая | Явная C# - Статическая | Сильная | Явная Haskell - Статическая | Сильная | Неявная Common Lisp - Динамическая | Сильная | Неявная D - Статическая | Сильная | Явная Delphi - Статическая | Сильная | Явная
ВОТ ТУТ ПРОСТО ОХУИТЕЛЬНО НАПИСАННО ПРО ТИПЫ ДАННЫХ, ТО ЧТО Я ИСКАЛ:
1 https://devpractice.ru/python-lesson-3-data-model/
1) https://www.andreyolegovich.ru/code/python/isinstance.php
2) https://pyneng.readthedocs.io/ru/latest/book/04_data_structures/index.html
2 https://habr.com/ru/post/161205/
P.S. в программировании как и в любой науке необязательно зубрить, главное думать как бы сделал ты или как тут примерно должно быть (найти последовательность).
Например, вот есть фаза - ноль, логично что это нули и единицы. Дальше. Нули и единицы это что - это цифры. Цифры можно преобразить в числа с помощью системы исчеслений. Затем, с помощью цифр - чисел можно общаться, причем с кем угодно, хоть с людьми (азбука морзе, хоть с компьютером). Дальше, чего не хватает...
И идя выше и выше по иерархии создается программа. То есть условно все числа - это тип Numbers в пайтон. 0 это нет 1 это да, то есть класс Логисеский (True - False). Если бы вы были создателем пайтона, я думаю вы бы тоже дали такое название)) Так как из чисел мы делаем буквы, то сделаем класс строки. Бляяя... Так ещё и название составные.. )) Просто логика))
Короче я к этому пришел логически:
В Python встроенные типы данных подразделяются на 2 группы:
- Скалярные (неделимые). Числа (целое, вещественное). Логический тип. NoneType.
- Структурированные (составные) / коллекции. Последовательности: строка, список, кортеж, числовой диапазон. Множества. Отображения: словарь.
Я думаю почитать вот эту штуку: https://www.yuripetrov.ru/edu/python/ch_03_01.html