Соглашение об объективности класса Python - PullRequest
0 голосов
/ 10 мая 2018

Это хороший стиль для создания таких классов? Я прочитал документ PEP8, но хорошего примера не увидел. Если нет, то как это правильно? Спасибо за любые ответы.

class Zone:
    def __init__(self, index=None, name=None):
        self._index = index
        self._name = name

    @property
    def index(self):
        return self._index

    @property
    def name(self):
        return self._name

    @index.setter
    def index(self, index):
        self._index = index

    @name.setter
    def name(self, name):
        self._name = name

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Если то, что вы намереваетесь сделать, это инкапсулировать ваши данные и установить их с помощью сеттеров и получить их с помощью геттеров, то то, что вы сделали, не поможет. вы объявили _name и _index как защищенные, это не значит, что они не могут быть доступны экстенсиональным функциям, поэтому функции за пределами класса могут легко получать к ним доступ и изменять их, что делает ваши методы получения и установки бесполезными.

Однако вы можете объявить их как частные, используя одно дополнительное подчеркивание перед собой, так что ваш класс свойств будет удален, а затем класс сеттеров будет полезен, к нему больше не будут обращаться внешние функции.

class Zone:
    def __init__(self,index=None,name=None):
        self.__index = index
        self.__name = name

    def index(self, index):
        self.__index = index

    def name(self, name):
        self.__name = name
    def get_name(self):
        return self.__name


zone=Zone()

zone.name('ben')

print(zone.get_name())
>>>ben
print(zone.__name)

>>> AttributeError: 'Zone' object has no attribute '__name'
0 голосов
/ 10 мая 2018

Ваши сеттеры и геттеры ничего не делают.В вашей реализации пользователь этого класса делает это:

z = Zone()
z.name = 'foo'
print(z.name)

Сравните с этой реализацией:

class Zone:
    def __init__(self, index=None, name=None):
        self.index = index
        self.name = name


z = Zone()
z.name = 'foo'
print(z.name)

Он работает точно так же с намного меньшим количеством кода.

Если вы не делаете что-либо в ваших установщиках и / или получателях, они вам не нужны.

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