Вопрос

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

Это было полезно?

Решение

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

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

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

Другие советы

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

В 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.

Пример кода сделан на C #

public class ClassName
{
   private string variable;

   public string property
   {
      get{ return variable; }
      set { variable = value; }
   }
}

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

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

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

Ваше здоровье!

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top