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
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)
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))
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'))