Данные в моем списке перезаписываются новыми данными, которые вводятся - PullRequest
0 голосов
/ 14 сентября 2018

Эй, я новичок в Python, просто пытаюсь выучить и улучшить свои навыки программирования, и я не могу понять, почему мой вывод из списка печатается неправильно.Следует распечатать: "Property Type: House" и "Purchase Type: purchase".Сразу после этого должны быть напечатаны "Property Type: Apt" и "Purchase Type: rental", но он печатает Apt и Rental дважды и игнорирует первую пару информации, которая была добавлена.Не могу понять, почему это так.Если кто-то может помочь, я был бы признателен.

class Agent:

    def __init__(self):
        self.properties = []

    def add_new_property(self, property_type, purchase_type):
        self.prop_type = property_type
        self.pur_type = purchase_type
        self.properties.append(self)

    def print_properties(self):
        for property in self.properties:
            print("Property Type: " + property.prop_type)
            print("Purchase Type: " + property.pur_type)

a = Agent()
a.add_new_property("house", "purchase")
a.add_new_property("apt", "rental")
a.print_properties()

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

Ваша ошибка заключалась в том, что вы использовали class Agent для хранения свойств, а также для их создания и назначения типа покупки.Разделение проблем, когда каждый объект делает только то, что должен, вероятно, является лучшим подходом.

Возможно, вы захотите иметь класс для Properties, который инкапсулирует тип имущества и тип покупки.

Вы также можете отделить обработку Properties от обработки Agent

Тогда, потому что вы хотите улучшить свои навыки программирования, и вы использовали термины Property typePurchase type, я предлагаю вам использовать Enums для создания правильного «типа» для этих объектов.

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

from enum import Enum


class PropertyType(Enum):
    HOUSE = 1, 'house' 
    APPARTMENT = 2

    def __str__(self):
        return self.name


class PurchaseType(Enum):
    PURCHASE = 1
    RENTAL = 2

    def __str__(self):
        return self.name


class Property:
    """represents one property"""

    def __init__(self, property_type, purchase_type):
        self.property_type = property_type
        self.purchase_type = purchase_type

    def __str__(self):
        return f'{self.property_type}, {self.purchase_type}'


class Properties:
    """represents a collection of properties"""

    def __init__(self):
        self.properties = []

    def __iter__(self):
        for ppty in self.properties:
            yield ppty

    def add_property(self, new_property):
        self.properties.append(new_property)

    def __str__(self):
        return '\n'.join('\t' + str(ppty) for ppty in self)


class Agent():
    """represents a real estate agens with his properties"""

    def __init__(self, name):
        self.name = name
        self.properties = Properties()

    def add_property(self, new_property):
        self.properties.add_property(new_property)

    def __str__(self):
        return f'{self.name}: \n{str(self.properties)}'


agent_john = Agent('John')
agent_john.add_property(Property(PropertyType.HOUSE, PurchaseType.PURCHASE))
agent_john.add_property(Property(PropertyType.APPARTMENT, PurchaseType.RENTAL))
print(agent_john)

output:

John: 
    HOUSE, PURCHASE
    APPARTMENT, RENTAL

Что, вероятно, все еще отсутствует, - это коллекция Agent

0 голосов
/ 14 сентября 2018

Просто идея, если вы используете словарь, вы можете немного урезать свой код, например:

class Agent:

    def __init__(self):
        self.props = {}

    def add_new_property(self, prop_type, buy_type):
        self.props[prop_type] =  buy_type

    def print_properties(self):
        for k, v in self.props.items():
            print(f"Property Type: {k}".ljust(20),f"Purchase Type: {v}")

a = Agent()
a.add_new_property("house", "purchase")
a.add_new_property("apt", "rental")
a.print_properties()

Вывод

(xenial)vash@localhost:~/python$ python3.7 class.py
Property Type: house Purchase Type: purchase
Property Type: apt   Purchase Type: rental
0 голосов
/ 14 сентября 2018

Как я прокомментировал выше, вы поймете, что вы добавляете объект к себе, поэтому нам нужно добавить копию объекта, а не себя.Это гарантирует, что указатели на объект и его копию различны.Следовательно, после обновления объекта мы все еще сохраняем его предыдущую копию

класса Agent:

def __init__(self):
    self.properties = []

def add_new_property(self, property_type, purchase_type):
    from copy import copy
    self.prop_type = property_type
    self.pur_type = purchase_type
    self.properties.append(copy(self))

def print_properties(self):
    for property in self.properties:
        print("Property Type: " + property.prop_type, end = '\t\t')
        print("Purchase Type: " + property.pur_type)


a = Agent()
a.add_new_property("house", "purchase")
a.add_new_property("apt", "rental")
a.print_properties()

Property Type: house            Purchase Type: purchase
Property Type: apt              Purchase Type: rental
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...