Python: Как мне сделать переменные экземпляра доступными? - PullRequest
4 голосов
/ 03 июня 2010

Предположим, у меня есть:

class myclass:
  def __init__(self):
    self.foo = "bar"

где значение foo должно быть доступно пользователям myclass. Можно ли просто читать значение foo непосредственно из экземпляра myclass? Должен ли я добавить метод get_foo в myclass или, возможно, добавить свойство foo? Какая лучшая практика здесь?

Ответы [ 5 ]

8 голосов
/ 03 июня 2010

Применимая максима Python будет «мы все взрослые здесь» - если пользователям нужен прямой доступ к значению foo, дайте им доступ к нему напрямую.Получатель или свойство имеют смысл, если вам нужно запустить какой-то код при обращении к нему, в противном случае лучше использовать прямой путь.

Кроме того, вы всегда можете прозрачно превратить его в свойство позже, если вам это нужно.

1 голос
/ 03 июня 2010

Зависит от того, что вы подразумеваете под «доступным пользователям myclass». Я думаю, что вы говорите об атрибуте класса, например:

>>> class Myclass(object):
...     foo = "bar"
...
>>> a = Myclass()
>>> a.foo
'bar'
>>> b = Myclass()
>>> b.foo
'bar'
>>> Myclass.foo = "zot"
>>> a.foo
'zot'
>>> b.foo
'zot'
>>>
1 голос
/ 03 июня 2010

Мое предложение, иди на самый простой! Прямой доступ к переменным экземпляра.

Вы можете утверждать, что если вы измените внутреннее представление ваших данных, вы хотели бы получить доступ к данным таким же образом, не заботясь о внутреннем представлении. Но эй ! если у вас есть get_foo и set_foo, семантически, это означает, что вы меняете переменную. Так что просто сделай так:)

PS: мне там нравится рубиновый подход :) 1005 *

1 голос
/ 03 июня 2010

В уроке по Python очень хорошее и краткое обсуждение этого вопроса, так что проверьте его. Так как в Python нет контроля доступа, и рекомендация такова: если есть что-то, что вы бы сделали закрытым в C ++, начните имя с _ в Python и "play nice". В противном случае просто получите к нему доступ напрямую.

1 голос
/ 03 июня 2010

Я думаю, что все в порядке, чтобы выставить "foo" как есть.Даже если вы прячете его за «добытчиком», настойчивый пользователь все равно сможет получить к нему доступ.Как сказал Цаман, «мы все здесь взрослые».

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

...