Содержание
Структура класса
class ClassName: 'Optional class documentation string' class_body
Тут:
class — объявление класса, аналогично def в функциях;
ClassName — имя класса; так же может включать в скобках имя «родительского класса» (наследование классов);
'Optional class documentation string' — опционально, описание класса, доступна при вызове ClassName.__doc__;
class_body — тело класса: методы и атрибуты класса.
Атрибуты данных класса — переменные, в области этого класса.
Атрибуты-методы класса — грубо говоря, функции, которые в нём описаны.
Для простоты — можно их называть как «атрибуты» (про атрибуты данных), и «методы» (про атрибуты-методы).
Простой пример класса на Python:
class thisIsClass:
# зададим два аргумента, разных типов - string и int
arg1 = 'string'
arg2 = 100
# определим метод
def method(self):
# действия, выполняемые методом
print 'nRunning method:'
print self.arg1
print self.arg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
# вызываем два аргумента экземпляра класса
print 'Printing arguments:'
print class_instance.arg1
print class_instance.arg2
# вызываем метод экземпляра класса
class_instance.method()
Выполним его:
$ ./class.py Printing arguments: string 100 Running method: string 100
Рассмотрим работу с методом класса.
Перым аргументом (в скобках после имени метода) всегда должен идти «пустой» аргумент, который общепринято называть «self«.
Он служит для связи экземпляра (объекта) класса, который вызывает этот метод, с самим классом.
Так же — необходимо указывать self при вызове атрибутов класса:
print self.arg1
Сам интерпретатор будет читать данный вызов как:
print class_instance.arg1
т.к. на место self будет подставлен сам объект класса (class_instance), который вызывает данный аргумент (arg1).
Можно переопределить имя в описании метода, что бы упростить написание:
class thisIsClass:
arg1 = 'string'
arg2 = 100
def method(self):
a1 = self.arg1
a2 = self.arg2
print 'nRunning method:'
print a1
print a2
И далее в классе и его объектах использовать аргументы a1 и a2, вместо self.arg1 и self.arg2.
Работа с аргументами
Для передачи новых значений методу класса — ему можно определить несколько дополнительных аргументов:
class thisIsClass:
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# создаём два новых агрумента - arg3 и arg4
def method(self, arg3, arg4):
# инициализируем их
self.a3 = arg3
self.a4 = arg4
print self.a3
print self.a4
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
# вызываем два аргумента экземпляра класса
print 'Printing static arguments:'
print class_instance.arg1
print class_instance.arg2
print 'nPrinting method additional arguments:'
# вызываем объект, и передаём ему
# два дополнительных (self не учитывается) аргумента
class_instance.method('This is arg3', 'This is arg4')
Результат:
./class.py Printing static arguments: string 100 Printing method additional arguments: This is arg3 This is arg4
Можно так же переопределить уже заданные аргументы:
class thisIsClass:
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def method(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
print self.arg1
print self.arg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
# вызываем два аргумента экземпляра класса
print 'Printing static arguments:'
print class_instance.arg1
print class_instance.arg2
print 'nPrinting method additional arguments:'
# вызываем объект, и передаём ему
# два дополнительных (self не учитывается) аргумента
class_instance.method('This is changed argument 1', 'This is achanged argument 2')
Что вернёт нам такой результат:
./class.py Printing static arguments: string 100 Printing method additional arguments: This is changed argument 1 This is achanged argumen 2
Или более наглядно — сделать так:
class thisIsClass:
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def method(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
# вызываем два аргумента экземпляра класса
print 'Printing static arguments:'
print class_instance.arg1
print class_instance.arg2
# вызываем объект, и передаём ему два дополнительных (self не учитывается) аргумента
class_instance.method('This is changed argument 1', 'This is achanged argument 2')
# вызываем два измененных аргумента экземпляра класса
print 'Printing changed arguments:'
print class_instance.arg1
print class_instance.arg2
Что приведёт к тому же результату.
Кроме того, объекту класса можно присваивать новые аргументы, которые не обозначены в самом классе:
class thisIsClass:
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def method(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
# вызываем два аргумента экземпляра класса
print 'Printing static arguments:'
print class_instance.arg1
print class_instance.arg2
# вызываем объект, и передаём ему два дополнительных (self не учитывается) аргумента
class_instance.method('This is changed argument 1', 'This is achanged argument 2')
# вызываем два измененных аргумента экземпляра класса
print 'Printing changed arguments:'
print class_instance.arg1
print class_instance.arg2
print 'nPrinting new object argument:'
# создаём объект класса с новым аргументом arg3
class_instance.arg3 = 'This is arg3'
print class_instance.arg3
$ ./class.py Printing static arguments: string 100 Printing changed arguments: This is changed argument 1 This is achanged argument 2 Printing new object argument: This is arg3
Специальные методы классов — метод __doc__
Как уже упоминалось в начале — строки, заключённые в тройные кавычки в классе будут применятся в его встроенном методе __doc__:
class thisIsClass:
'''This is class documentation'''
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def method(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass()
print class_instance.__doc__
Результат:
$ ./class.py This is class documentation
Специальные методы классов — метод __init__
Метод __init__ будет вызываться каждый раз при создании нового объекта класса.
Таким образом — нет необходимости отдельного вызывать объект класса с методом, что бы передать новые аргументы:
class thisIsClass:
'''This is class documentation'''
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def __init__(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём экземпляр (или "объект") класса
class_instance = thisIsClass('This is first argument', 'This is second argument')
print 'Printing arguments from __init__:'
print (class_instance.arg1, class_instance.arg2)
Результат:
$ ./class.py
Printing arguments from __init__:
('This is first argument', 'This is second argument')
Однако, если вызывать такой объект класса, но не передать ему при создании аргументы — будет вызвана ошибка:
class thisIsClass:
'''This is class documentation'''
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
def __init__(self, changearg1, changearg2):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём экземпляр (или "объект") класса
# без передачи аргументов
class_instance = thisIsClass()
print 'Printing arguments from __init__:'
print (class_instance.arg1, class_instance.arg2)
Результат:
$ ./class.py
Traceback (most recent call last):
File "./class.py", line 17, in <module>
class_instance = thisIsClass()
TypeError: __init__() takes exactly 3 arguments (1 given)
Заметьте — в описании ошибки говорится что «метод __init__ принимает 3 аргумента, но только 1 передан» — этот 1 и есть аргумент self, о котором говорилось выше.
Что бы избежать этого — можно задать аргументы по-умолчанию:
class thisIsClass:
'''This is class documentation'''
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
# и после символа = задаём значения по-умолчанию
def __init__(self, changearg1='Default value 1', changearg2='Default value 2'):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
# создадём пустой экземпляр (или "объект") класса
class_instance_def = thisIsClass()
print 'nPrinting default arguments from __init__:'
print (class_instance_def.arg1, class_instance_def.arg2)
# создадём экземпляр (или "объект") класса с аргументами
class_instance_changed = thisIsClass('This is first argument', 'This is second argument')
print 'nPrinting changed arguments from __init__:'
print (class_instance_changed.arg1, class_instance_changed.arg2)
Результат:
$ ./class.py
Printing default arguments from __init__:
('Default value 1', 'Default value 2')
Printing changed arguments from __init__:
('This is first argument', 'This is second argument')
Импорт классов
Предположим, наш файл с описанием класса называется classfile.py и содержит почти тот же код, кроме создания объекта класса и вызовов:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
class thisIsClass:
'''This is class documentation'''
# зададим два аргумента
arg1 = 'string'
arg2 = 100
# зададим два аргумента - changearg1, changearg2
# и после символа = задаём значения по-умолчанию
def __init__(self, changearg1='Default value 1', changearg2='Default value 2'):
# переопределяем уже созданные аргументы arg1 и arg2
self.arg1 = changearg1
self.arg2 = changearg2
Создадим новый файл — script.py, который будет содержать такой код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# импортируем файл с описанием класса
# который по сути является модулем
import classfile
# создадём пустой экземпляр (или "объект") класса
# с указанием имени модуля
class_instance_def = classfile.thisIsClass()
print 'nPrinting default arguments from __init__:'
print (class_instance_def.arg1, class_instance_def.arg2)
# создадём экземпляр (или "объект") класса с аргументами
# и тоже указываем имя модуля
class_instance_changed = classfile.thisIsClass('This is first argument', 'This is second argument')
print 'nPrinting changed arguments from __init__:'
print (class_instance_changed.arg1, class_instance_changed.arg2)
Что бы импортировать не все классы из модуля, а только один — используем оператор from:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# импортируем класс из модуля classfile
from classfile import thisIsClass
# создадём пустой экземпляр (или "объект") класса
# теперь имя модуля можно не указывать
# т.к. класс был импортирован "напрямую"
class_instance_def = thisIsClass()
print 'nPrinting default arguments from __init__:'
print (class_instance_def.arg1, class_instance_def.arg2)
# создадём экземпляр (или "объект") класса с аргументами
# тоже без указания имени модуля
class_instance_changed = thisIsClass('This is first argument', 'This is second argument')
print 'nPrinting changed arguments from __init__:'
print (class_instance_changed.arg1, class_instance_changed.arg2)
Оба варианта нам дадут одинаковый результат:
$ ./script.py
Printing default arguments from __init__:
('Default value 1', 'Default value 2')
Printing changed arguments from __init__:
('This is first argument', 'This is second argument')
Это лишь малая часть о классах в Python. В будущем — рассмотрим такие понятия как «полиформизм«, «инкапсуляция«, «композиция» и, конечно же, «наследование«.




