Лучший способ получить атрибуты данных в Python? - PullRequest
9 голосов
/ 17 сентября 2011

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

Допустим, у меня есть класс:

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

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

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

Ответы [ 3 ]

13 голосов
/ 17 сентября 2011

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

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 просто введите свойство, когда вам действительно требуется расширенное поведение, а не ранее .

8 голосов
/ 17 сентября 2011

@ 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 для вашего объекта.

0 голосов
/ 17 сентября 2011

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

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