@Span4ev

Как вывести вместо булевого значение другое?

Здравствуйте. Я учу ренпай, но использую классы пайтона, который не очень хорошо знаю. Знание самого ренпая не имеет значения, тут всё на пайтоне.
У меня есть десятки параметров экземпляра класса, или True или False. Нужно выводить в информационную панель по запросу состояние. Цифровое значение, "False" или "True" - не проблема, но как выводить другое слово, в зависимости от булевого значения? Я хочу вместо "False" выводить "нет". Например вот так:

class Person:
        def __init__(self, name):

        	self.name 	= name
        	self.something_1 = False
        	self.something_2 = True

       	# как сюда передать название уже имеющегося атрибута класса и вывести его состояние?
        # Чтобы attr связывался с атрибутом класса, вместо attr подставлялось self.something_2
       	# Что-то типа этого

        def show_info(self, attr):

        	if attr == False:
        		return 'Нет'
        	else:
        		return 'Есть'


Чтобы при

Anna = Person('Anna)
Anna.something_2


Я получал не "True", а "Есть"
  • Вопрос задан
  • 108 просмотров
Решения вопроса 1
lxstvayne
@lxstvayne
Люблю Python
Можно адаптировать как вам угодно
class BaseField:
    def __init__(self, value):
        self.value = value

    def __eq__(self, other):
        if isinstance(other, BaseField):
            return self.value == other.value

        return self.value == other

    def __repr__(self):
        return str(self.value)


class BoolField(BaseField):
    def __str__(self):
        return {
            True: 'Есть',
            False: 'Нет'
        }.get(self.value)


class MoneyField(BaseField):
    def __str__(self):
        return f'{self.value}$'


class Person:
    def __init__(self, name):
        self.name = name
        self.something_1 = BoolField(False)
        self.something_2 = BoolField(True)
        self.money = MoneyField(1500)


p = Person('Vladimir')

print(p.something_1)
print(p.money)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@kamenyuga
Выглядит как стандартная проблема данных и их представления.

Можно все запихнуть в класс, используя, например, property - как раз для этого случая они подходят на 100%. Но придется написать много кода.

Альтернатива - разделить данные и представление. В простом случае - за пределами класса нужно будет создать словарь (набор словарей) для выбора текста в зависимости от данных. Именно так зачастую работают всякие системы локализации, переводов, кастомизации внешнего вида и т.д.

class Person:

    has_map = {True: 'Есть', False: 'Нет'}

    def __init__(self, name):
        self.name = name
        self._something_1 = False
        self._something_2 = True

    @property
    def something_1(self):
        return self.has_map[self._something_1]

    @something_1.setter
    def something_1(self, value):
        self._something_1 = value

    @property
    def something_2(self):
        return self.has_map[self._something_2]

    @something_2.setter
    def something_2(self, value):
        self._something_2 = value

def attr_mapping(value):
    has_map = {True: 'Есть', False: 'Нет'}
    if isinstance(value, bool):
        return has_map[value]

if __name__ == '__main__':

    Anna = Person('Anna')
    print(Anna.something_2)
    Anna.something_2 = False
    print(Anna.something_2)

    Anna = Person('Anna')
    print(attr_mapping(Anna._something_2))
    Anna._something_2 = False
    print(attr_mapping(Anna._something_2))
Ответ написан
Комментировать
shabelski89
@shabelski89
engineer
class Person:
    def __init__(self, name):
        self.name = name
        self.something_1 = 'abc'
        self.something_2 = 123


def check_attr(obj, attr_name):
    try:
        value = obj.__getattribute__(attr_name)
        return f'{obj} имеет аттрибут - {attr_name} со значением - {value}'
    except AttributeError:
        return f'{obj} не имеет аттрибута - {attr_name}'


if __name__ == "__main__":
    p = Person(name='Alex')

    print(check_attr(p, 'something_1'))
    print(check_attr(p, 'something_2'))
    print(check_attr(p, 'something_33333'))
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
01 мая 2024, в 02:11
5000 руб./за проект
01 мая 2024, в 00:29
2000 руб./за проект
01 мая 2024, в 00:20
15000 руб./за проект