Классы в Python
Введение | |
Атрибуты | |
Статические атрибуты | |
Объекты | |
Похожие статьи |
Введение
Классы нужно называть с заглавной буквы и использовать 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"
class Employee: pass emp_1 = Employee() emp_2 = Employee() print(emp_1) print(emp_2) emp_1.first = 'Yuri' emp_1.last = 'Gagarin' emp_1.email = 'Yuri.Gagarin@vostok.su' emp_1.pay = 1000 emp_2.first = 'Test' emp_2.last = 'User' emp_2.email = 'Test.User@vostok.su' emp_2.pay = 1234 print(emp_1.email) print(emp_2.email)
python emp_ex.py
<__main__.Employee object at 0x7fca67c26fd0> <__main__.Employee object at 0x7fca67c26fa0> Yuri.Gagarin@vostok.su Test.User@vostok.su
Также чтобы создавать атрибуты нужно использьвать метод __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
Объекты
Все классы в 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__']
OOP in Python | |
Classes | |
Methods | |
class variables | |
class methods | |
Static Methods | |
Inheritance | |
Special Methods | |
property decorator | |
Python | |
Functions | |
super() |