В чем разница между свойством и переменной экземпляра? - PullRequest
7 голосов
/ 01 мая 2009

Я думаю, что я использовал эти термины взаимозаменяемо / неправильно!

Ответы [ 10 ]

17 голосов
/ 01 мая 2009

Иан, это в основном вопрос терминологии, и, несмотря на то, что тег «независимый от языка» связан с этим вопросом, очень связан с языком / средой.

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

Когда речь идет о конкретном языке, эти два могут быть разными. Например, в C # свойство фактически является функцией, которая возвращает объект, в то время как переменная экземпляра является нестатической переменной-членом класса.

3 голосов
/ 01 мая 2009

Херши прав в том, что это зависит от языка. Но чтобы добавить к следам конкретных ответов:

В Python переменная экземпляра - это атрибут экземпляра (обычно), который упоминается в словаре экземпляра. Это аналогично членам или переменным экземпляра в Java, за исключением того, что все общедоступно.

Свойства - это ярлыки для методов получения / установки, которые выглядят как переменная экземпляра . Таким образом, в следующем определении класса (модифицированного из манифеста объекта нового стиля Гвидо *):

class C(object):

    def __init__(self):
        self.y = 0

    def getx(self):
        if self.y < 0: return 0
        else: return self.y

    def setx(self, x):
        self.y = x

    x = property(getx, setx)

>>> z = C()
>>> z.x = -3
>>> print z.x
0
>>> print z.y
-3
>>> z.x = 5
>>> print z.x
5
>>> print z.y
5

y - это переменная экземпляра z, x - это свойство. (В общем, когда свойство определено, есть некоторые методы, используемые для того, чтобы скрыть связанную переменную экземпляра, чтобы другой код не обращался к нему напрямую.) Преимущество свойств в python заключается в том, что разработчику не нужно обходиться преимущественная инкапсуляция всех переменных экземпляра, поскольку будущая инкапсуляция путем преобразования переменной экземпляра в свойство не должна нарушать какой-либо существующий код (если код не использует лазейки, которые пытается исправить ваша инкапсуляция, или полагается на проверку классов или некоторые другие метаданные -программирование).

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

2 голосов
/ 01 мая 2009

В цели c свойство - это переменная экземпляра, которая может использовать перегруженный оператор точки для вызова своих методов установки и получения. Таким образом, my.food = "cheeseburger" фактически интерпретируется как [my setFood: "cheeseburger"]. Это еще один случай, когда определение определенно не зависит от языка, так как target-c определяет ключевое слово @property.

2 голосов
/ 01 мая 2009

пример кода на C #

public class ClassName
{
   private string variable;

   public string property
   {
      get{ return variable; }
      set { variable = value; }
   }
}
1 голос
/ 01 мая 2009

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

1 голос
/ 01 мая 2009

Может быть, это потому, что вы впервые пришли из C ++, верно ?! В школьные годы у меня были профессора, которые все время говорили о свойствах класса или атрибутах класса. С тех пор как я перешел в мир Java C #, я начал слышать об участниках. Члены класса, члены экземпляра ...

И тогда свойства раскрываются! в Java и .NET. Поэтому я думаю, что вам лучше называть его членами. Являются ли они членами экземпляра (или, как вы называли это переменной экземпляра) или членами класса ....

Ура! * * 1005

0 голосов
/ 01 мая 2009

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

Различие наиболее очевидно в компонентно-ориентированном программировании, которое полезно везде, но легче всего понять в графическом пользовательском интерфейсе. В этом контексте я склонен думать о конфигурации компонента во время разработки как о манипулировании «свойствами» объекта. Например, я выбираю цвета переднего плана и фона, стиль рамки и шрифт поля ввода текста, устанавливая его свойства. Хотя эти свойства могут быть изменены во время выполнения, обычно это не так. Во время выполнения гораздо более вероятно чтение и запись другого набора переменных, представляющих содержимое поля. Я считаю эту информацию «состоянием» компонента.

Почему это различие полезно? При создании абстракции для соединения компонентов, как правило, необходимо отображать только переменные «состояния». Возвращаясь к примеру с текстовым полем, вы можете объявить интерфейс, обеспечивающий доступ к текущему контенту. Но «свойства», которые управляют внешним видом компонента, определяются только в конкретном классе реализации.

0 голосов
/ 01 мая 2009

Свойство - это данные, связанные с объектом. Например, свойство круга - это его диаметр, а другим - его площадь.

Переменная экземпляра - это фрагмент данных, который хранится в объекте. Это не обязательно должно соответствовать непосредственно собственности. Например, (хе), круг может хранить свой радиус в переменной экземпляра и вычислять его диаметр и площадь на основе этого радиуса. Все три свойства все еще являются свойствами, но в переменной экземпляра сохраняется только радиус.

Некоторые языки имеют понятие «первоклассных» свойств. Это означает, что для клиентского приложения свойство выглядит и используется как переменная экземпляра. То есть вместо того, чтобы писать что-то вроде circle.getDiameter(), вы бы написали circle.diameter, а вместо circle.setRadius(5) вы бы написали circle.radius = 5.

0 голосов
/ 01 мая 2009

При добавлении к тому, что было сказано, в языке, подобном C #, свойство, по сути, является функцией get и set. В результате, он может иметь собственную логику, которая работает в дополнение к получению / настройке. Переменная экземпляра не может этого сделать.

0 голосов
/ 01 мая 2009

В Java есть нечто, называемое Свойства JavaBeans , но это в основном переменная экземпляра, которая следует определенному шаблону именования для своих методов получения и установки.

...