Как вы поддерживаете код в соответствии с несколькими разработчиками? - PullRequest
0 голосов
/ 14 февраля 2019

Я знаю, что Python - это динамически типизированный язык, и я, вероятно, пытаюсь воссоздать здесь поведение Java.Тем не менее, у меня есть команда людей, работающих над этой кодовой базой, и моя цель с кодом состоит в том, чтобы гарантировать, что они делают вещи согласованным образом.Позвольте мне привести пример:

class Company:
    def __init__(self, j):
        self.locations = []

Когда они создают объект Company, создается пустой список, содержащий местоположения.Теперь с помощью Python все можно добавить в список.Однако я хотел бы, чтобы этот список содержал только объекты Location:

class Location:
    def __init__(self, j):
        self.address = None
        self.city = None
        self.state = None
        self.zip = None

Я делаю это с классами, чтобы код самодокументировался.Другими словами, «местоположение имеет только эти атрибуты».Моя цель состоит в том, чтобы они сделали это:

c = Company()
l = Location()
l.city = "New York"
c.locations.append(l)

К сожалению, ничто не мешает им просто выполнить c.locations.append("foo"), и ничто не указывает им, что c.locations должен быть списком объектов Location.

Как Pythonic обеспечивает согласованность при работе с командой разработчиков?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

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

class ListOfLocations(list):
   def append(self,l):
      if not isinstance(l, Location): raise TypeError("Location required here")
      else: super().append(l)
0 голосов
/ 14 февраля 2019

Решение ООП состоит в том, чтобы гарантировать, что пользователям API вашего класса не нужно напрямую взаимодействовать с атрибутами вашего экземпляра.

Методы

Один из подходов заключается в реализации методов, которые инкапсулируютлогика добавления местоположения.

Пример

class Company:
    def __init__(self, j):
        self.locations = []

    def add_location(self, location):
        if isinstance(location, Location):
            self.locations.append(location)
        else:
            raise TypeError("argument 'location' should be a Location object")

Свойства

Другая концепция ООП, которую вы можете использовать, это свойство .Свойства - это простой способ определить методы получения и установки для атрибутов вашего экземпляра.

Пример

Предположим, мы хотим применить определенный формат для атрибута Location.zip

class Location:
    def __init__(self):
        self._zip = None

    @property
    def zip(self):
        return self._zip

    @zip.setter
    def zip(self, value):
        if some_condition_on_value:
            self._zip = value
        else:
            raise ValueError('Incorrect format')

    @zip.deleter
    def zip(self):
        self._zip = None

Обратите внимание, что атрибут Location()._zip по-прежнему доступен и доступен для записи.В то время как подчеркивание обозначает, что должно быть закрытым атрибутом, на самом деле ничего не является приватным в Python .

Последнее слово

Из-за высоких возможностей Python в области самоанализа ничто никогда не будет полностьюбезопасный.Вам придется сесть с вашей командой и обсудить инструменты и практику, которые вы хотите использовать.Ни один класс или экземпляр класса не может удержать вас от всего, что находится внутри (это делает интроспекцию возможной и мощной).Python доверяет вам.Там написано: «Эй, если ты хочешь ковыряться в темных местах, я верю, что у тебя есть веская причина, и у тебя нет проблем».

В конце концов, мывсе согласные взрослые здесь.

--- Карл Фаст

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