ifullut
@ifullut
Учу программирование понарошку...

Как понять что атрибут это определенный класс в Python?

Всем привет. Разбираюсь с ООП в Python. И решил сделать что-то наподобие калькулятора, используя классы.
Вот код:
class Object:
    def __init__(self, type, info):
        self.type = type
        self.info = info
    def Get(self, what):
        if what == "type":
             return self.type
        elif what == "info":
             return self.info
class Int(Object):
     def __init__(self, info):
          Object.type = "int"
          Object.info = info

class Math:
    def __init__(self, first, second=""):
        #тут надо понять программе, что атрибуты first и second являются классами Int (не базовому int, а моему классу Int).
    def sum(self):
        return int(self.first) + int(self.second)

i1 = Int("8")
i2 = Int("2")
m = Math(i1, i2)
print(m.sum())

Как вы поняли классу Math надо понять, что атрибуты first и second являются экземплярами класса Int, и когда она это поймёт достать из нее числа 8 и 2 и вывести их сумму
  • Вопрос задан
  • 102 просмотра
Решения вопроса 1
sswwssww
@sswwssww
class Math:
    def __init__(self, first, second=""):
        if isinstance(first, Int) and isinstance(second, Int):
            self.first = first
            self.second = second
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
SoreMix
@SoreMix Куратор тега Python
yellow
class Math:
    def __init__(self, first, second=""):
        print(type(first)) # <class '__main__.Int'>

Он прекрасно понимает, к какому классу относится переменная
Ответ написан
@Vindicar
Вообще в питоне принята динамическая типизация - иными словами, если класс имеет нужные свойства и методы, то неважно какой это класс на самом деле.

Но если позарез нужно, то есть способы.

1. Динамическая проверка класса при выполнении
isinstance(x, list) проверит, что объект является списком или наследуется от списка.
isinstance(x, (list, tuple)) сделает то же для пары возможных классов
Я бы не рекомендовал такой подход, так как проверка выполняется каждый раз при выполнении, даже если её результат заведомо известен. Кроме того, нередки ситуации, когда метод обозначен как "ожидает список", но при этом всё что делает со списком - перебирает элементы. Т.е. на деле любая коллекция сработала бы.

2. Статическая проверка (погугли про python type hints)
Переписываешь заголовок метода так:
from typing import Optional
class Math:
    def __init__(self, first: Int, second: Optional[Int] = None):

Если потом передать в конструктор неверные типы, сам интерпретатор питона проигнорирует это и выполнит скрипт как обычно. Но есть отдельная утилита mypy, которая статически (без запуска скрипта) анализирует скрипт и проверяет, что ты передаёшь в тот или иной метод, и выдаст ошибку если тип неверный. Таким образом можно статически убедиться в корректности скрипта, не теряя производительность во время выполнения.

3. Протоколы
Это развитие предыдущего подхода, подобие интерфейсов в других ООП языках. Они также используются совместно с mypy, интерпретатор питона их игнорирует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы