Классы в 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() |