Как осуществляется работа метода @property.getter() в Python?

Как определить getter метод с разными типами возвращаемых значений в зависимости от типа запроса?
  • 24 октября 2023 г. 14:19
Ответы на вопрос 8
Метод `@property.getter()` в Python позволяет определить функцию в качестве геттера для свойства класса. Когда свойство получается, вызывается соответствующий геттер.

Ниже пример, чтобы проиллюстрировать работу `@property.getter()`:

```python
class MyClass:
    def __init__(self):
        self._value = 0

    @property
    def value(self):
        return self._value

    @value.getter
    def value(self):
        print("Getting value...")
        return self._value

obj = MyClass()
print(obj.value) # Выводит "Getting value..." и 0
```

В этом примере, при обращении к свойству `value`, вызывается геттер `value`, который выводит "Getting value..." и возвращает значение `self._value`.

Определение разных типов возвращаемых значений в зависимости от типа запроса может быть сделано с помощью ветвления или использования условной конструкции внутри геттера. Вот пример:

```python
class MyClass:
    def __init__(self, value):
        self._value = value

    @property
    def value(self):
        if isinstance(self._value, int):
            print("Getting integer value...")
            return self._value
        elif isinstance(self._value, str):
            print("Getting string value...")
            return self._value
        else:
            return None

obj1 = MyClass(10)
print(obj1.value)  # Выводит "Getting integer value..." и 10

obj2 = MyClass("Hello")
print(obj2.value)  # Выводит "Getting string value..." и "Hello"
```

В этом примере геттер `value` определяет разные возвращаемые значения в зависимости от типа значения `self._value`.
class TestClass:
    def __init__(self, number: (int, str)):
        self._number = number

    @property
    def number(self):
        if isinstance(self._number, int):
            return self.__int_number()
        elif isinstance(self._number, str):
            return self.__str_number()
        else:
            return self._number

    @number.setter
    def number(self, value):
        self._number = value

    def __int_number(self):
        return self._number * 100

    def __str_number(self):
        return f'Hello world - {self._number}'

value_int = 150 
 testInstance = TestClass(value_int) 
 print(testInstance.number)

value_str = '0MG' 
 testInstance.number = value_str 
 print(testInstance.number)

value_another_type = ['one', 'two'] 
 testInstance.number = value_another_type 
 print(testInstance.number)
Похожие вопросы