@PeteDoherty

Почему вместо данных словаря показывает содержимое ячейки?

Ребят, подскажите почему при распечатывании данных словаря, вместо данных класса, интерпретатор выдает данные ячейки памяти?

class Owners: 
    def __init__(self, name, phone_number, age):
        try:
            self.name = name if type(name) == 'str' else str(name)
            self.phone_number = phone_number if type(phone_number) == 'str' else str(phone_number)
            self.age = age if type(age) == 'int' else int(age)
        except Exception:
            print('Error Type')

    def __str__(self): 
        return ''.join(self.name + ' ' + self.phone_number + ' ' + str(self.age))

def new_owner(): 
  
  name = input('Имя: ' )
  telephone = input('Телефон: ')
  age = input('Возраст: ')
  owner = Owners(name, telephone, age)
  return owner
  
  
class Vehicle:
    def __init__(self, num, color, vehicle_type, health):
        self.num = num if type(num) == 'str' else str(num)
        self.color = color if type(color) == 'str' else str(color)
        self.vehicle_type = vehicle_type if type(vehicle_type) == 'str' else str(vehicle_type)
        self.health = health if type(health) == 'int' else int(health)
    
    def __str__(self): 
        return ''.join(self.num + ' ' + self.color + ' '  + self.vehicle_type + ' ' + str(self.health)) 
    
    def heal(self):
        self.health = 100


    def condition(self, damage):
        self.health -= damage
        
    
def new_vehicle(owner): 
    num = input('Номeр автомобиля: ' )
    color = input('Цвет автомобиля: ' )
    vehicle_type = input('Тип автомобиля: ')
    health = input('Состояние автомобиля (%): ')
    vehicle = Vehicle(num, color, vehicle_type, health)
    return vehicle
    

data_autowner = {}
 
def main(): 
  auto_owner = new_owner()
  auto_vehicle = new_vehicle(auto_owner)  
  data_autowner[auto_owner.name] = auto_owner, auto_vehicle
  print (data_autowner)
  
main()  </source>
  • Вопрос задан
  • 93 просмотра
Решения вопроса 1
sswwssww
@sswwssww
К слову:
self.name = name if type(name) == 'str' else str(name)

- у вас всегда будет False(если только владельца не зовут str).
Правильный вариант:
self.name = name if isinstance(name, str) else str(name)

А так, эта проверка здесь вообще не нужна, так как в функции new_owner вы используете везде input-ы, которые возвращают строки.
В Vehincle и new_vehicle аналогичная ситуация.
Так же
return ''.join(self.name + ' ' + self.phone_number + ' ' + str(self.age))

пишите либо так:
return ' '.join((self.name, phone_number, str(self.age)))

либо так:
return self.name + ' ' + self.phone_number + ' ' + str(self.age)

или лучше вот так:
return f'{self.name} {self.phone_number} {self.age}'

а можно и:
return '{0} {1} {2}'.format(self.name, self.phone_number, self.age)


Касательно самого вопроса,
data_autowner[auto_owner.name] = auto_owner, auto_vehicle
здесь auto_owner и auto_vehicle это объекты классов, так как ты переопределил их методы __str__ - при печати самих объектов все будет ок, но ты засовываешь эти объекты в словарь, а потом печатаешь САМ СЛОВАРЬ (а это значит что к объектам словаря будет применен repr), поэтому и получаешь то что получаешь. Т.е. если ты сделаешь вот так
data_autowner[auto_owner.name] = str(auto_owner), str(auto_vehicle)
то получишь то что хочешь.
Но так делать это дурной тон(мягко говоря), лучше переопредели еще __repr__, точно так же как ты сделал с __str__.
def __repr__(self): 
        return ' '.join((self.name, self.phone_number, str(self.age)))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
1. Как-то странно у вас join сделан. Он принимает итерируемый объект, и объединяет все через вашу строку.
Зачем сложили строки и сунули туда - не ясно

2. Он и должен вернуть объект, потому что вы печатаете сразу несколько классов, еще и в кортеже. Распечатайте просто auto_owner или auto_vehicle
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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