![]() Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь 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; просмотров: 323; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.142.135.53 (0.009 с.) |