Руководство по использованию различных типов переменных в классе Python? - PullRequest
1 голос
/ 12 сентября 2011

Я потратил некоторое время на поиск руководства о том, как решить, как хранить данные и функции в классе Python. Я должен указать, что я новичок в ООП, поэтому ответы, такие как:

атрибуты данных соответствуют «переменным экземпляра» в Smalltalk и «членов данных» в C ++. (как видно из http://docs.python.org/tutorial/classes.html

оставь меня почесать голову. Я полагаю, что я хочу узнать о OOP, предназначенном для программистов на Python. Я хотел бы надеяться, что руководство / учебник для начинающих будет также включать в себя какой-то глоссарий или определения, поэтому после прочтения я смогу разумно рассказать о различных типах доступных переменных. Я хочу понять мыслительные процессы, лежащие в основе решения о том, когда использовать формы a, b, c и d в следующем коде.

class MyClass(object):
    a = 0

    def __init__(self):
        b = 0
        self.c = 0
        self.__d = 0

    def __getd(self):
        return self.__d

    d = property(__getd, None, None, None)

Ответы [ 3 ]

2 голосов
/ 12 сентября 2011

a, b и c показывают разные области действия переменных.Это означает, что эти переменные имеют различную видимость и среду, в которой они действительны.

Сначала вам нужно понять разницу между классом и объектом.Класс - это средство описания некоторого общего поведения.Затем объект создается на основе этого класса.Объект «наследует» все методы класса и может определять переменные, которые связаны с объектом.Идея состоит в том, что объекты инкапсулируют некоторые данные и требуемое поведение для работы с этими данными.Это основное отличие от процедурного программирования, где модули определяют поведение, а не данные.

c теперь является такой переменной экземпляра, что означает переменную, которая находится в области действия экземпляра MyClass.self всегда является ссылкой на текущий экземпляр объекта, под которым выполняется текущий код.Технически, __d работает так же, как c, и имеет ту же область видимости.Разница здесь в том, что в Python существует соглашение о том, что переменные и методы, начинающиеся с двух подчеркиваний, должны считаться закрытыми и не должны использоваться кодом вне класса.Это необходимо, потому что в Python нет способа точно определить приватные или защищенные методы и переменные, как это делают многие другие языки.

b - это простоепеременная, которая действительна только внутри метода __init__.Если выполнение выходит из метода __init__, переменная b будет собирать мусор и больше не будет доступна, в то время как c и __d все еще допустимы.Обратите внимание, что b не предшествует self.

Теперь a определяется непосредственно в классе.Это делает его так называемой переменной класса.Как правило, он используется для хранения статических данных.Эта переменная одинакова для всех экземпляров класса MyClass.

Обратите внимание, что это описание немного упрощено и опускает такие вещи, как метаклассы и различие между функциями и связанными методами, но вы понимаете, что ....

1 голос
/ 12 сентября 2011

Популярная онлайн-книга для новичков Погружение в Python См. Главу 5, особенно.

Что касается ваших вопросов:

  • a - переменная класса (одинаковая для всех объектов этого класса.)
  • b является локальной (временной) переменной, не связанной с классом. Назначение ему внутри метода __init__() может заставить вас думать, что оно сохраняется после вызова __init__(), но это не так. Вы можете подумать, что b может ссылаться на глобальный (как это было бы в других языках), но в Python, когда область явно не указана и нет global b оператора по сути, переменная относится к самой внутренней области видимости .

  • c, d - переменные экземпляра (каждый объект может иметь разные значения); и их различная семантика означает:

  • c - это обычная переменная экземпляра, которую можно прочитать или записать как object.c (класс не определяет для нее метод получения или установки)
  • __d является частной переменной, доступной только для чтения и предназначенной для доступа через функцию получения getd () ; строка его свойств показывает, что у него нет сеттера setd () , поэтому его нельзя изменить. Префикс двойного подчеркивания __ означает, что он является внутренним и не предназначен для доступа к чему-либо вне класса.
  • d - это свойство, которое позволяет (только для чтения) доступ к __d, но, как указывает Майкл, без необходимости хранения дополнительной переменной, и его можно вычислить динамически, когда getd () называется.
1 голос
/ 12 сентября 2011
  1. а.для переменных, общих для всех экземпляров MyClass
  2. b.для переменной, которая будет существовать только внутри функции <strong>init</strong>.
  3. c.предназначен для атрибута конкретного экземпляра MyClass и является частью внешнего интерфейса MyClass (т. е. не удивляйтесь, если какой-нибудь другой программист обманет эту переменную).Недостаток использования «с» заключается в том, что он снижает вашу гибкость при внесении изменений до MyClass (в какой-то момент кто-то, вероятно, будет полагаться на тот факт, что «с» существует и делает определенные вещи, поэтому, если вы решитереорганизовать свой класс, вам нужно быть готовым к тому, чтобы всегда держать букву «с»).
  4. __d.для атрибута конкретного экземпляра MyClass и является частью внутренней реализации MyClass;можно предположить, что только код MyClass будет читать / записывать этот атрибут.
  5. d.Делает __d похожим на c.Однако преимущество использования d с __d состоит в том, что если, например, d () можно вычислить из какого-либо другого атрибута, можно было бы исключить дополнительное хранилище __d.Кроме того, вы гарантируете, что это только внешнее чтение, а не внешнее.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...