Решение ООП состоит в том, чтобы гарантировать, что пользователям 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 доверяет вам.Там написано: «Эй, если ты хочешь ковыряться в темных местах, я верю, что у тебя есть веская причина, и у тебя нет проблем».
В конце концов, мывсе согласные взрослые здесь.
--- Карл Фаст