В чем разница между свойством и переменной экземпляра?
Я думаю, что я использовал эти термины взаимозаменяемо / неправильно!
10 ответов
Вообще-то, это вопрос терминологии, и, несмотря на то, что тег "независимый от языка" связан с этим вопросом, он очень связан с языком / средой.
Для обсуждения разработки свойства и переменная экземпляра могут использоваться взаимозаменяемо, поскольку идея заключается в том, что свойство представляет собой элемент данных, описывающий объект.
Когда речь идет о конкретном языке, эти два могут быть разными. Например, в 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 свойство - это переменная экземпляра, которая может использовать перегруженный оператор точки для вызова своего метода set и get. Таким образом, my.food = "cheeseburger" фактически интерпретируется как [my setFood:"cheeseburger"]. Это еще один случай, когда определение определенно не зависит от языка, так как target-c определяет ключевое слово @property.
Пример кода сделан в C#
public class ClassName
{
private string variable;
public string property
{
get{ return variable; }
set { variable = value; }
}
}
Свойство может и, как я полагаю, в большинстве случаев возвращает переменную экземпляра, но может сделать больше. Вы можете поместить логику в свойство, агрегировать значения или обновить другие переменные экземпляра и т. Д. Однако я думаю, что лучше избегать этого. Логика должна идти в методы.
Может быть, это потому, что вы впервые пришли из C++, верно?! В школьные годы у меня были профессора, которые все время говорили о свойствах класса или атрибутах класса. С тех пор как я перешел в мир Java C#, я начал слышать об участниках. Члены класса, члены экземпляра...
И тогда свойства проявятся! в Java и.NET. Поэтому я думаю, что вам лучше называть это членами. Являются ли они членами экземпляра (или, как вы называли это переменной экземпляра) или членами класса....
Ура!
Свойство - это своего рода данные, связанные с объектом. Например, свойство круга - это его диаметр, а другим - его площадь.
Переменная экземпляра - это фрагмент данных, который хранится в объекте. Это не обязательно должно соответствовать непосредственно собственности. Например (хе), круг может хранить свой радиус в переменной экземпляра и вычислять его диаметр и площадь на основе этого радиуса. Все три свойства все еще являются свойствами, но в переменной экземпляра сохраняется только радиус.
Некоторые языки имеют понятие "первоклассных" свойств. Это означает, что для клиентского приложения свойство выглядит и используется как переменная экземпляра. То есть вместо того, чтобы писать что-то вроде circle.getDiameter()
Вы бы написали circle.diameter
и вместо circle.setRadius(5)
Вы бы написали circle.radius = 5
,
В Java у нас есть нечто, называемое JavaBeans Properties, но это в основном переменная экземпляра, которая следует определенному шаблону именования для своих методов получения и установки.
В отличие от других ответов, я думаю, что существует полезное различие между переменными-членами и свойствами, которые не зависят от языка.
Различие наиболее очевидно в компонентно-ориентированном программировании, которое полезно везде, но легче всего понять в графическом пользовательском интерфейсе. В этом контексте я склонен думать о конфигурации компонента во время разработки как о манипулировании "свойствами" объекта. Например, я выбираю цвета переднего плана и фона, стиль рамки и шрифт поля ввода текста, устанавливая его свойства. Хотя эти свойства могут быть изменены во время выполнения, как правило, это не так. Во время выполнения гораздо более вероятно чтение и запись другого набора переменных, представляющих содержимое поля. Я считаю эту информацию "состоянием" компонента.
Почему это различие полезно? При создании абстракции для соединения компонентов, как правило, необходимо отображать только переменные "состояния". Возвращаясь к примеру с текстовым полем, вы можете объявить интерфейс, обеспечивающий доступ к текущему контенту. Но "свойства", которые управляют внешним видом компонента, определяются только в конкретном классе реализации.
При добавлении к тому, что было сказано, в языке, таком как C#, свойство, по сути, является функцией get и set. В результате, он может иметь собственную логику, которая работает в дополнение к получению / настройке. Переменная экземпляра не может сделать это.