Классы в Python

Содержание
Введение
Атрибуты
Статические атрибуты
Методы
self
Для чего нужен метод __init__()
Похожие статьи

Введение

Классы нужно называть с заглавной буквы и использовать CamelCase.

Создается новый класс с помощью class

Объект данного класса создаётся с помощью =

объект = ИмяКласса()

Самый простой пример использования

class Sample(): pass my_sample = Sample() print(type(my_sample))

<class '__main__.Sample'>

Классы без атрибутов и методов практически бесполезны.

Атрибуты

Атрибуты это свойства объекта. Бытовой пример: у велосипеда есть страна производитель , масса, цвет, количество скоростей, цена и так далее.

У сайта в интернете есть, url, год делегирования домена, автор, основная тема.

Чтобы создавать атрибуты достаточно объявить класс и создать объект.

Создадим класс Site и объект hh с адресом сайта.

class Site(): pass hh = Site() hh.url = "https://www.heihei.ru"

Также чтобы создавать атрибуты нужно использьвать метод __init__() в этом случае каждый раз когда создаётся новый объект данного класса первым делом вызывается метод __init__()

Создадим класс Dog, у которого будет один атрибут - порода (breed). У каждого объекта этот атрибут будет доступен следующим образом

объект.атрибут

Когда создается класс у него может быть любое название, но внутри класса, чтобы задать значение атрибута используется ключевое слово self

self.атрибут = значени

Таким образом, если вы поменяете название класса, внутри переименовывать ничего не нужно.

class Cat(): def __init__(self, breed): self.breed = breed

Переименовываем Cat на Dog

class Dog(): def __init__(self, breed): self.breed = breed

Если у класса есть атрибут нужно внимательнее отнестить к созданию объекта

my_dog = Dog()

Уже не сработает

Traceback (most recent call last): File "/home/andrei/python/sample.py", line 6, in <module> my_dog = Dog() TypeError: __init__() missing 1 required positional argument: 'breed'

Теперь при создании объекта нужно задавать желаемое значение атрибута

my_dog = Dog("husky")

Либо в методе __init__() нужно указать значение по умолчанию

class Dog(): def __init__(self, breed="aidi"): self.breed = breed

Новичкам может показаться странной строка

self.breed = breed

Здесь главное усвоить следующее:

Именно self.breed - задаёт название атрибута, которое будет у объекта данного класса.

В данном случае атрибут будет называться breed

breed - это название параметра у метода __init__().

В данном случае - первый аргумент, передаваемый вами в метод __init__() называется breed

Можно назвать его и по-другому, например arg1, суть от этого не изменится, но если их будет много - тяжелее станет запоминать какому атрибуту соответствует, скажем, arg99.

class Dog(): def __init__(self, agr1): self.breed = arg1

Теперь попробую объяснить тоже самое, но немного по-другому и уже с двумя атрибутами

class Dog: def __init__(self, name, age): self.name = name self.age = age

То, что после точки - это название атрибута. Оно нужно, чтобы потом обращаться к этому атрибуту.

Зелёным я выделил названия параметров. Часто в примерах у атрибута и параметра одинаковые названия. Это не обязательное условие, которое может помешать пониманию сути.

Сравните следующие объявления классов.

Только формальные названия из которых ничего не понятно

class Dog: def __init__(self, arg1, arg2): self.attr1 = arg1 self.attr2 = arg2 pet = Dog("Tuzik", 2) print(pet.attr1) print(pet.attr2)

Понятные названия, но у атрибутов и у параметров __init__() они разные

class Dog: def __init__(self, name, age): self.nick = name self.years = age pet = Dog("Tuzik", 2) print(pet.nick) print(pet.year)

Понятные и одинаковые названия

class Dog: def __init__(self, name, age): self.name = name self.age = age pet = Dog("Tuzik", 2) print(pet.name) print(pet.age)

Результат вызова у всех трёх вариантов одинаковый

Tuzik
2

Пример с тремя атрибутами

class Dog(): def __init__(self, breed, name, spots): self.breed = breed self.name = name self.spots = spots # my_dog = Dog() my_dog = Dog("husky", "Barbos", True) print(my_dog.breed, my_dog.name, my_dog.spots)

Статические атрибуты

Можно задавать атрибуты сразу для всех элементов класса. Они называются статическими (static attributes, class object attributes)

class Dog(): # CLASS OBJECT ATTRIBUTE # SAME FOR ANY INSTANCE OF A CLASS bioclass = "mammal" def __init__(self, breed, name, spots): self.breed = breed self.name = name self.spots = spots # При создании объекта static атрибут можно не указывать явно my_dog = Dog("husky", "Barbos", True) # Проверим значение bioclass заданное по умолчанию print(Dog.bioclass, my_dog.bioclass) # Переопределим значение bioclass для my_dog my_dog.bioclass = "super mammal" print(Dog.bioclass, my_dog.bioclass)

mammal mammal
mammal super mammal

Методы

Методы это функции внутри классов. Аргументы, которые принимет метод - это объект класса, какие-то другие нужные для этого метода аргументы.

Если говорить простыми словами - "с улицы" метод вызвать нельзя, сначала нужно сообщить хотя бы с каким классом нужно работать.

В случае обычных методов нужно ещё и передать объект класса. Рассмотрим скрипт method_example.py

class Dog(): bioclass = "mammal" def __init__(self, breed, name, spots): self.breed = breed self.name = name self.spots = spots def bark(self): print("WOOF!") my_dog = Dog("husky", "Barbos", True) my_dog.bark()

python method_example.py

WOOF!

Отличие метода от функции

Под методом подразумевается обычный метод, не статический и не classmethod Метод это функция в рамках какого-то класса.

Метод ждёт, что его применят к объекту его класса

В метод по-умолчанию нужно передавать объект его класса.

Функция ждёт что в неё передадут определённые аргументы либо работает вообще без аргументов

Аргументы могут быть как стандартными объектами так и объектами пользовательского класса. Это определятеся при объявлении функции

В функцию у которой нет параметров можно вообще ничего не передавать и она будет работать.

Объекты

Все классы в Python кроме Exception наследуются от object

>>> o = object()
>>> dir(o)

['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']

self

Ещё несколько слов про self

Вернёмся к скрипту method_example.py

class Dog(): bioclass = "mammal" def __init__(self, breed, name, spots): self.breed = breed self.name = name self.spots = spots def bark(self): print("WOOF!") my_dog = Dog("husky", "Barbos", True) my_dog.bark()

python method_example.py

WOOF!

Что будет если убрать из

def bark(self):

self, оставив

def bark():

python method_example.py

Traceback (most recent call last): File "/home/andrei/python/method_example.py", line 14, in <module> my_dog.bark() TypeError: bark() takes 0 positional arguments but 1 was given

Казалось бы никаких аргументов в bark() мы не передавали. Тем не менее один передался автоматически. А всё потому, что запись

my_dog.bark()

Это краткая версия

Dog.bark(my_dog)

То есть, ожидается что в метод будет передан объект данного класса. Поэтому и нужно указывать

def bark(self):

А не

def bark():

__init__()

Метод __init__() позволяет быстрее создавать объекты данного класса.

Сравните два класса Site без __init__() и WebSite с __init__()

class Site(): pass hh = Site() hh.url = "https://www.heihei.ru" hh.name = "HeiHei.ru" hh.description = "Сайт о праздниках" hh.established = 2018 tb = Site() tb.url = "https://www.topbicycle.ru" tb.name = "TobBicycle" tb.description = "Обзоры на велосипеды" tb.established = 2018 print(hh.url, hh.name, hh.description, hh.established) print(tb.url, tb.name, tb.description, tb.description) class WebSite(): def __init__(self, url, name, description, established): self.url = url self.name = name self.description = description self.established = established hh = WebSite("https://www.heihei.ru", "HeiHei.ru", "Сайт о праздниках", 2018) tb = WebSite("https://www.topbicycle.ru", "TobBicycle.ru", "Обзоры на велосипеды", 2018) print(hh.url, hh.name, hh.description, hh.established) print(tb.url, tb.name, tb.description, tb.description)

python init_example.py

https://www.heihei.ru HeiHei.ru Сайт о праздниках 2018 https://www.topbicycle.ru TobBicycle.ru Обзоры на велосипеды Обзоры на велосипеды https://www.heihei.ru HeiHei.ru Сайт о праздниках 2018 https://www.topbicycle.ru TobBicycle.ru Обзоры на велосипеды Обзоры на велосипеды

Пример использования методов класса list

Рассмотрим список (list) в интерактивном режиме

python

>>> mylist = [1,2,3] >>> mylist.append(4) >>> mylist [1, 2, 3, 4] >>> mylist.pop() 4 >>> mylist [1, 2, 3] >>> help(mylist.insert) Help on built-in function insert: insert(index, object, /) method of builtins.list instance Insert object before index.

Похожие статьи
ООП в Python
Классы
Методы
class variables
class methods
Статические методы
Наследование
Специальные методы
Декоратор property
Python
Функции
super()