понедельник, 26 января 2015 г.

Язык программирования Python. Классы (3)

Инкапсуляция — ограничение доступа к методам и атрибутам. Инкапсуляция делает некоторые из компонент доступными только внутри класса(начинающиеся с _ и __).

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

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

Композиция - механизм для создания нового класса путем объединения нескольких объектов существующих классов в одно целое.


синтаксис
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__!


Комментариев нет:

Отправить комментарий