Лучший способ получить атрибуты данных в Python?

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

Скажем, у меня есть класс:

class Thing:
    def __init__(self, whatever):
        self.whatever = whatever

x = Thing('foo')

Теперь я знаю, что если я хочу получить атрибут whatever, я могу это сделать:

x.whatever

У меня есть привычка (вероятно, потому, что я исхожу из других языков оо), чтобы определить методы для получения атрибутов класса по мере необходимости и использовать их, чтобы восстановить их непосредственно, например:

class Thing:
    def __init__(self, whatever):
        self.whatever = whatever

    def getWhatever(self):
        return self.whatever

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

Но поскольку я не являюсь ветераном-питоном, я бы с удовольствием узнал, правильно ли я прав, или какие-то другие подходы лучше и более питоничны. Мысли?

+9
источник поделиться
3 ответа

Определение явных getters и seters - это плохая практика в Python. Вместо этого используйте свойства:

class Thing(object): # New-style class
    def __init__(self, whatever):
        self._whatever = whatever

    @property
    def whatever(self):
        return self._whatever # Insert complicated calculation here

Поэтому вместо предварительного планирования с помощью методов get просто введите свойство, когда вам действительно нужно расширенное поведение, и не ранее.

+13
источник

@phihag имеет правильную идею и упоминает в своем ответе, но более подробно об этом: первый шаг - просто использовать атрибут напрямую:

class Thing(object):
    def __init__(self, whatever):
        self.whatever = whatever


t = Thing(12)
assert t.whatever == 12

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

class Thing(object):
    def __init__(self, whatever):
        self._whatever = whatever

    @property
    def whatever(self):
        return something_complicated(self._whatever)


t = Thing(12)
assert t.whatever == 12

Таким образом, вызывающий код не изменяется, и у вас есть хороший чистый API для вашего объекта.

+8
источник

проверить свойство python() http://docs.python.org/library/functions.html#property

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос