Инкапсуляция — ограничение доступа к методам и атрибутам. Инкапсуляция делает некоторые из компонент
доступными только внутри класса(начинающиеся с _ и __).
Наследование подразумевает то, что дочерний класс содержит все атрибуты и методы родительского класса, которые могут быть переопределены.
Полиморфизм - возможность использования одного и того же имени операции или метода к объектам разных классов, при этом действия, совершаемые с объектами, могут существенно различаться.
Композиция - механизм для создания нового класса путем объединения нескольких объектов существующих классов в одно целое.
синтаксис
class ClassName (class1, class2, ...): # в скобках родительские классы
smth # описание атрибутов и методов
пример
class stradd:
a = 123 # атрибут самого! класса
def __init__(self, b): # для инициализации экземпляра класса (конструктор)
self.b = b # атрибут для экземпляра
def multy(self,line,value): # определение метода
self.line = line
self.value = value
return self.line*self.value
def __del__(self): # деструктор класса
pass
first = stradd() # first - экземпляр класса
print(first.a)
print(first.multy('ret',3))
first.a = 456 # изменяем атрибут (!экземпляра)(переопределяем)
print(first.a)
Имеется ряд специализированных методов, такие методы обрамлены двумя подчеркиваниями и могут быть переопределены! (например методы __init__, __call__ )
пример
class Books:
def __init__(self, name, color, author=None, sheets='100'): # author принимает значение None
self.name = name
self.author = author
self.color = color
self.sheets = sheets
def raised(self, number):
self.sheets = int(self.sheets) + number
class Issues(Books): # Метод __init__ наследуем от родительского
def raised(self, number, adds):
Books.raised(self, number + adds) # !правильно дополняем метод
if __name__ == '__main__': # если запускаем как скрипт то выполняем следующее
a = Books('first book', author = 'John', color = 'red', sheets = '500')
print (a.name, a.author, a.color, a.sheets)
b = Books('second book', color = 'blue')
print (b.name, b.author, b.color, b.sheets)
a.raised(200)
print (a.sheets)
c = Issues('Other book', color='green', sheets='300')
c.raised(100,45)
print (c.sheets)
Абстрактные классы
Такие классы содержат методы без реализации, но требующие реализацию (переопределение) в наследуемых (дочерних) классах.
пример
from abc import ABCMeta, abstractmethod # используем модуль abc
class One(metaclass = ABCMeta):
@abstractmethod # декоратор
def test(self, x): # абстрактный метод
pass
class Two(One): # класс не переопределяет метод
pass
class Three(One):
def test(self, x): # класс переопределяет метод
print (x)
try:
a = Two()
a.test(2) # ошибка!
except TypeError as err:
print ('Ошибка: ', err)
b = Three() # здесь ошибки нет, так как метод переопределен!
b.test(3)
Слоты
class Book(object):
__slots__ = ['author', 'title', 'year'] # Только имена перечисленные в списке __slots__ могут
быть атрибутами экземпляра
...
b = Book() # экземпляр
b.title = 'First book'
b.color = 'green' # ошибка - нет атрибута color
Где используется __slots__ не используется атрибут __dict__!
Наследование подразумевает то, что дочерний класс содержит все атрибуты и методы родительского класса, которые могут быть переопределены.
Полиморфизм - возможность использования одного и того же имени операции или метода к объектам разных классов, при этом действия, совершаемые с объектами, могут существенно различаться.
Композиция - механизм для создания нового класса путем объединения нескольких объектов существующих классов в одно целое.
синтаксис
class ClassName (class1, class2, ...): # в скобках родительские классы
smth # описание атрибутов и методов
пример
class stradd:
a = 123 # атрибут самого! класса
def __init__(self, b): # для инициализации экземпляра класса (конструктор)
self.b = b # атрибут для экземпляра
def multy(self,line,value): # определение метода
self.line = line
self.value = value
return self.line*self.value
def __del__(self): # деструктор класса
pass
first = stradd() # first - экземпляр класса
print(first.a)
print(first.multy('ret',3))
first.a = 456 # изменяем атрибут (!экземпляра)(переопределяем)
print(first.a)
Имеется ряд специализированных методов, такие методы обрамлены двумя подчеркиваниями и могут быть переопределены! (например методы __init__, __call__ )
пример
class Books:
def __init__(self, name, color, author=None, sheets='100'): # author принимает значение None
self.name = name
self.author = author
self.color = color
self.sheets = sheets
def raised(self, number):
self.sheets = int(self.sheets) + number
class Issues(Books): # Метод __init__ наследуем от родительского
def raised(self, number, adds):
Books.raised(self, number + adds) # !правильно дополняем метод
if __name__ == '__main__': # если запускаем как скрипт то выполняем следующее
a = Books('first book', author = 'John', color = 'red', sheets = '500')
print (a.name, a.author, a.color, a.sheets)
b = Books('second book', color = 'blue')
print (b.name, b.author, b.color, b.sheets)
a.raised(200)
print (a.sheets)
c = Issues('Other book', color='green', sheets='300')
c.raised(100,45)
print (c.sheets)
Абстрактные классы
Такие классы содержат методы без реализации, но требующие реализацию (переопределение) в наследуемых (дочерних) классах.
пример
from abc import ABCMeta, abstractmethod # используем модуль abc
class One(metaclass = ABCMeta):
@abstractmethod # декоратор
def test(self, x): # абстрактный метод
pass
class Two(One): # класс не переопределяет метод
pass
class Three(One):
def test(self, x): # класс переопределяет метод
print (x)
try:
a = Two()
a.test(2) # ошибка!
except TypeError as err:
print ('Ошибка: ', err)
b = Three() # здесь ошибки нет, так как метод переопределен!
b.test(3)
Слоты
class Book(object):
__slots__ = ['author', 'title', 'year'] # Только имена перечисленные в списке __slots__ могут
быть атрибутами экземпляра
...
b = Book() # экземпляр
b.title = 'First book'
b.color = 'green' # ошибка - нет атрибута color
Где используется __slots__ не используется атрибут __dict__!
Комментариев нет:
Отправить комментарий