Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Статические методы и методы классаСодержание книги
Поиск на нашем сайте
Листинг 13.16. Статические методы class MyClass: @staticmethod def func1(x, y): # Статический метод return x + y def func2(self, x, y): # Обычный метод в классе return x + y def func3(self, x, y): return MyClass.func1(x, y) # Вызов из метода класса
print(MyClass.func1(10, 20)) # Вызываем статический метод c = MyClass() print(c.func2(15, 6)) # Вызываем метод класса print(c.func1(50, 12)) # Вызываем статический метод # через экземпляр класса print(c.func3(23, 5)) # Вызываем статический метод # внутри класса
Листинг 13.17. Методы класса class MyClass: @classmethod def func(cls, x): # Метод класса print(cls, x) MyClass.func(10) # Вызываем метод через название класса c = MyClass() c.func(50) # Вызываем метод класса через экземпляр Абстрактные методы Листинг 13.18. Абстрактные методы class Class1: def func(self, x): # Абстрактный метод # Возбуждаем исключение с помощью raise raise NotImplementedError("Необходимо переопределить метод")
class Class2(Class1): # Наследуем абстрактный метод def func(self, x): # Переопределяем метод print(x)
class Class3(Class1): # Класс не переопределяет метод pass
c2 = Class2() c2.func(50) # Выведет: 50 c3 = Class3() try: # Перехватываем исключения c3.func(50) # Ошибка. Метод func() не переопределен except NotImplementedError as msg: print(msg) # Выведет: Необходимо переопределить метод
Листинг 13.19. Использование декоратора @abstractmethod from abc import ABCMeta, abstractmethod class Class1(metaclass=ABCMeta): @abstractmethod def func(self, x): # Абстрактный метод pass
class Class2(Class1): # Наследуем абстрактный метод def func(self, x): # Переопределяем метод print(x) class Class3(Class1): # Класс не переопределяет метод pass
c2 = Class2() c2.func(50) # Выведет: 50 try: c3 = Class3() # Ошибка. Метод func() не переопределен c3.func(50) except TypeError as msg: print(msg) # Can't instantiate abstract class Class3 # with abstract methods func
Листинг 13.20. Абстрактный статический метод и абстрактный метод класса from abc import ABCMeta, abstractmethod class MyClass(metaclass=ABCMeta): @staticmethod @abstractmethod def static_func(self, x): # Абстрактный статический метод pass
@classmethod @abstractmethod def class_func(self, x): # Абстрактный метод класса pass 13.9. Ограничение доступа Листинг 13.21. Псевдочастные идентификаторы class MyClass: def __init__(self, x): self.__privateVar = x def set_var(self, x): # Изменение значения self.__privateVar = x def get_var(self): # Получение значения return self.__privateVar c = MyClass(10) # Создаем экземпляр класса print(c.get_var()) # Выведет: 10 c.set_var(20) # Изменяем значение print(c.get_var()) # Выведет: 20 try: # Перехватываем ошибки print(c.__privateVar) # Ошибка!!! except AttributeError as msg: print(msg) # Выведет: 'MyClass' object has # no attribute '__privateVar' c._MyClass__privateVar = 50 # Значение псевдочастных атрибутов # все равно можно изменить print(c.get_var()) # Выведет: 50
Листинг 13.22. Атрибут __slots__ class MyClass: __slots__ = ["x", "y"] def __init__(self, a, b): self.x, self.y = a, b c = MyClass(1, 2) print(c.x, c.y) # Выведет: 1 2 c.x, c.y = 10, 20 # Изменяем значения атрибутов print(c.x, c.y) # Выведет: 10 20 try: # Перехватываем исключения c.z = 50 # Атрибут z не указан в __slots__, # поэтому возбуждается исключение except AttributeError as msg: print(msg) # 'MyClass' object has no attribute 'z' Свойства класса Листинг 13.23. Свойства класса class MyClass: def __init__(self, value): self.__var = value def get_var(self): # Чтение return self.__var def set_var(self, value): # Запись self.__var = value def del_var(self): # Удаление del self.__var v = property(get_var, set_var, del_var, "Строка документирования") c = MyClass(5) c.v = 35 # Вызывается метод set_var() print(c.v) # Вызывается метод get_var() del c.v # Вызывается метод del_var()
Листинг 13.24. Методы getter(), setter() и deleter() class MyClass: def __init__(self, value): self.__var = value @property def v(self): # Чтение return self.__var @v.setter def v(self, value): # Запись self.__var = value @v.deleter def v(self): # Удаление del self.__var c = MyClass(5) c.v = 35 # Запись print(c.v) # Чтение del c.v # Удаление
Листинг 13.25. Определение абстрактного свойства from abc import ABCMeta, abstractmethod class MyClass1(metaclass=ABCMeta): def __init__(self, value): self.__var = value @property @abctractmethod def v(self): # Чтение return self.__var @v.setter @abctractmethod def v(self, value): # Запись self.__var = value @v.deleter @abctractmethod def v(self): # Удаление del self.__var Декораторы классов Листинг 13.26. Декораторы классов def deco(C): # Принимает объект класса print("Внутри декоратора") # Производит какие-то действия return C # Возвращает объект класса
@deco class MyClass: def __init__(self, value): self.v = value c = MyClass(5) print(c.v) Обработка исключений >>> print("Нет завершающей кавычки!) SyntaxError: EOL while scanning string literal
>>> def test(x, y): return x / y
>>> test(4, 2) # Нормально 2.0 >>> test(4, 0) # Ошибка Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> test(4, 0) # Ошибка File "<pyshell#2>", line 1, in test def test(x, y): return x / y ZeroDivisionError: division by zero
>>> "Строка".index("текст") Traceback (most recent call last): File "<pyshell#5>", line 1, in <module> "Строка".index("текст") ValueError: substring not found 14.1. Инструкция try...except...else...finally Листинг 14.1. Обработка деления на ноль try: # Перехватываем исключения x = 1 / 0 # Ошибка: деление на 0 except ZeroDivisionError: # Указываем класс исключения print("Обработали деление на 0") x = 0 print(x) # Выведет: 0
Листинг 14.2. Вложенные обработчики try: # Обрабатываем исключения try: # Вложенный обработчик x = 1 / 0 # Ошибка: деление на 0 except NameError: print("Неопределенный идентификатор") except IndexError: print("Несуществующий индекс") print("Выражение после вложенного обработчика") except ZeroDivisionError: print("Обработка деления на 0") x = 0 print(x) # Выведет: 0
Листинг 14.3. Обработка нескольких исключений try: x = 1 / 0 except (NameError, IndexError, ZeroDivisionError): # Обработка сразу нескольких исключений x = 0 print(x) # Выведет: 0
Листинг 14.4. Получение информации об исключении try: x = 1 / 0 # Ошибка деления на 0 except (NameError, IndexError, ZeroDivisionError) as err: print(err.__class__.__name__) # Название класса исключения print(err) # Текст сообщения об ошибке
Листинг 14.5. Пример использования функции exc_info() import sys, traceback try: x = 1 / 0 except ZeroDivisionError: Type, Value, Trace = sys.exc_info() print("Type: ", Type) print("Value:", Value) print("Trace:", Trace) print("\n", "print_exception()".center(40, "-")) traceback.print_exception(Type, Value, Trace, limit=5, file=sys.stdout) print("\n", "print_tb()".center(40, "-")) traceback.print_tb(Trace, limit=1, file=sys.stdout) print("\n", "format_exception()".center(40, "-")) print(traceback.format_exception(Type, Value, Trace, limit=5)) print("\n", "format_exception_only()".center(40, "-")) print(traceback.format_exception_only(Type, Value))
Листинг 14.7. Пример перехвата всех исключений try: x = 1 / 0 # Ошибка деления на 0 except: # Обработка всех исключений x = 0 print(x) # Выведет: 0
Листинг 14.8. Блоки else и finally try: x = 10 / 2 # Нет ошибки #x = 10 / 0 # Ошибка деления на 0 except ZeroDivisionError: print("Деление на 0") else: print("Блок else") finally: print("Блок finally")
>>> try: x = 10 / 0 finally: print("Блок finally")
Блок finally Traceback (most recent call last): File "<pyshell#17>", line 2, in <module> x = 10 / 0 ZeroDivisionError: division by zero
Листинг 14.9. Суммирование неопределенного количества чисел # -*- coding: utf-8 -*- print("Введите слово 'stop' для получения результата") summa = 0 while True: x = input("Введите число: ") if x == "stop": break # Выход из цикла try: x = int(x) # Преобразуем строку в число except ValueError: print("Необходимо ввести целое число!") else: summa += x print("Сумма чисел равна:", summa) input() 14.2. Инструкция with...as Листинг 14.10. Протокол менеджеров контекста class MyClass: def __enter__(self): print("Вызван метод __enter__()") return self def __exit__(self, Type, Value, Trace): print("Вызван метод __exit__()") if Type is None: # Если исключение не возникло print("Исключение не возникло") else: # Если возникло исключение print("Value =", Value) return False # False — исключение не обработано # True — исключение обработано print("Последовательность при отсутствии исключения:") with MyClass(): print("Блок внутри with") print("\nПоследовательность при наличии исключения:") with MyClass() as obj: print("Блок внутри with") raise TypeError("Исключение TypeError")
Листинг 14.11. Инструкция with...as with open("test.txt", "a", encoding="utf-8") as f: f.write("Строка\n") # Записываем строку в конец файла
|
||||
Последнее изменение этой страницы: 2016-06-23; просмотров: 314; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.109.251 (0.006 с.) |