Python класс и методы - лучшая практика для доступа и изменения атрибутов? - PullRequest
0 голосов
/ 27 мая 2020

TL; DR: как лучше всего получить доступ к атрибутам экземпляра класса и изменить их?

Допустим, у нас есть класс для создания объекта, который предназначен для хранения данных о продукте (например, может быть, набор основных данных продукта ).

class StoreProduct(object):

    def __init__(self,ProductID,ProductPrice,ProductDescription):
        self.ProductID = ProductID
        self.ProductPrice = ProductPrice
        self.ProductDescription = ProductDescription


    def ChangeProductPrice(self, newProductPrice):
        self.ProductPrice = newProductPrice

И у нас есть другой класс, который мы можем использовать для доступа к этим экземплярам, ​​созданным StoreProduct (), с методами для внесения корректировок / изменений.

class ChangeProductData(object):

    def __init__(self):
        pass
    @staticmethod
    def ChangeProductObjectPrice(newProductPrice,ProductObject):

        ProductObject.ProductPrice = newProductPrice

Итак мы создаем экземпляр с именем Product1:

Product1 = StoreProduct(
    ProductID="Product1",
    ProductPrice=4,
    ProductDescription="A nice lamp"
)

Какой код лучше всего использовать для чтения и / или изменения экземпляров класса?

Если бы я хотел изменить атрибут в продукте 1 (в данном случае price) в целом приемлемо, или это плохой код?

Метод 1

ChangeProductData().ChangeProductObjectPrice(8,Product1)

Или это предпочтительный способ?

Метод 2

Product1.ChangeProductPrice(2)

Когда могут быть исключения?

Хотя вышеупомянутые упрощенные ситуации, то, что я сейчас прочитал, похоже, указывает что Метод 2 может быть лучшей практикой. Однако не будет ли метод 1 обеспечивать большую гибкость в будущем (например, если вам нужно изменить способ работы метода или добавить новые методы).

Я также читал в getattr () и setattr (), но люди, похоже, не знают, лучше ли это использовать точку (например, Product1.ProductPrice, чтобы узнать цену).

1 Ответ

0 голосов
/ 27 мая 2020

Определенно метод 2. Как упоминает @ user2357112, метод 1 не имеет смысла. Как вы правильно заметили, это простой сценарий, и путь pythoni c будет использовать property

class StoreProduct(object):  # minor: please notice the PEP styling
    def __init__(self, product_price):
        self._price = produce_price
        # other attributes, omitted for brevity

    @property
    def product_price(self):  # pythonic getter
        return self._price

    @product_price.setter
    def product_price(self, new_price):  # python setter
        # you could do any custom validation before setting
        self._price = new_price

Переходя к вопросу

Я в частности, решение вопроса о том, является ли доступ и изменение атрибута класса другим классом большим запретом.

  • Доступ: Доступ здесь разрешен. Фактически, многие шаблоны проектирования, которые в значительной степени полагаются на композицию, делают это. например, adapter, strategy, decorator, command et c шаблонов

  • Изменение: вы хотите, чтобы класс, владеющий атрибутом, отвечал за «изменение ". Внешние классы должны только запрашивать изменение .

PS Это немного похоже на шаблон CQRS (Command Query Responsibility Segregation)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...