В чем разница между свойством и переменной экземпляра?
-
03-07-2019 - |
Вопрос
Я думаю, что я использовал эти термины взаимозаменяемо / неправильно!
Решение
Иэн, это в основном вопрос терминологии, и, несмотря на «независимость от языка» тег, связанный с этим вопросом, очень связанный с языком / средой.
Для обсуждения разработки свойства и переменная экземпляра могут использоваться взаимозаменяемо, поскольку идея заключается в том, что свойство представляет собой элемент данных, описывающий объект.
Когда речь идет о конкретном языке, эти два могут быть разными. Например, в C # свойство на самом деле является функцией, которая возвращает объект, в то время как переменная экземпляра является нестатической переменной-членом класса.
Другие советы
Херши прав в том, что это зависит от языка. Но чтобы добавить к следам конкретных ответов:
В Python переменная экземпляра - это атрибут экземпляра (обычно), который упоминается в словаре экземпляра. Это аналогично членам или переменным экземпляра в Java, за исключением того, что все общедоступно.
Свойства - это ярлыки для методов получения / установки, которые выглядят как переменные экземпляра . Таким образом, в следующем определении класса (изменено из нового манифеста объекта стиля Гвидо ): р>
Все это очень длинный ответ, чтобы сказать, что на уровне дизайна хорошо говорить о свойствах. Это не зависит от того, какой тип инкапсуляции вам может понадобиться. Я полагаю, что этот принцип не зависит от языка, но применим к языкам помимо Python. 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 заключается в том, что разработчику не нужно обходиться преимущественная инкапсуляция всех переменных экземпляра, поскольку будущая инкапсуляция путем преобразования переменной экземпляра в свойство не должна нарушать какой-либо существующий код (если код не использует лазейки, которые пытается исправить ваша инкапсуляция, или полагается на проверку классов или некоторые другие метаданные -программирование).
Пример кода сделан на 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
.
В отличие от других приведенных ответов, я делаю думаю, что существует полезное различие между переменными-членами и свойствами, не зависящими от языка.
Различие наиболее очевидно в компонентно-ориентированном программировании, которое полезно везде, но легче всего понять в графическом пользовательском интерфейсе. В этом контексте я склонен думать о конфигурации компонента во время разработки как о манипулировании «свойствами». объекта. Например, я выбираю цвета переднего плана и фона, стиль рамки и шрифт поля ввода текста, устанавливая его свойства. Хотя эти свойства можно изменить во время выполнения, обычно это не так. Во время выполнения гораздо более вероятно чтение и запись другого набора переменных, представляющих содержимое поля. Я воспринимаю эту информацию как «состояние» компонента.
Почему это различие полезно? При создании абстракции для соединения компонентов, как правило, используется только «состояние». переменные должны быть выставлены. Возвращаясь к примеру с текстовым полем, вы можете объявить интерфейс, обеспечивающий доступ к текущему контенту. Но «свойства» которые управляют внешним видом компонента, определяются только в конкретном классе реализации.