Статические методы и методы класса 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Статические методы и методы класса



Листинг 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; просмотров: 273; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.97.189 (0.037 с.)