我想我一直在混淆/错误地使用这些术语!
Iain,这基本上是一个术语问题,尽管与此问题相关联的“语言无关”的标签,但它与特定编程语言/环境相关。
从设计讨论的角度来看,属性(property)和实例变量(instance variable)可以互换使用,因为其含义是属性是描述对象的数据项。
然而,在特定的编程语言中,这两者有所不同。例如,在C#中,属性(property)实际上是返回对象的函数,而实例变量(instance variable)则是类的非静态成员变量。
在这个问题上,Hershi是正确的,它是与语言相关的。但是为了增加语言相关的答案:
在Python中,实例变量是实例的属性,通常是在实例的字典中引用的内容。这类似于Java中的成员或实例变量,只不过Python中所有的东西都是公开的。
属性是getter/setter方法的快捷方式,看起来就像一个实例变量。因此,在以下类定义中(修改自Guido的新风格对象宣言):
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; }
}
}
然后出现了Properties!在Java和.NET中。所以我认为最好称它们为成员。无论它们是实例成员(或者像你所说的实例变量)还是类成员....
干杯!
属性是与对象相关联的某种数据。例如,圆形的一个属性是直径,另一个属性是面积。
实例变量是存储在对象内部的一段数据。它不一定需要直接对应一个属性。例如(哈哈),圆可能会将其半径存储在实例变量中,并基于该半径计算直径和面积。所有三个变量仍然是属性,但只有半径存储在实例变量中。
一些语言具有“一流”属性的概念。这意味着对于客户端应用程序而言,属性看起来并且像实例变量一样使用。也就是说,您可以写 circle.diameter
代替 circle.getDiameter()
,以及写 circle.radius = 5
代替 circle.setRadius(5)
。