属性和实例变量有什么区别?

8

我想我一直在混淆/错误地使用这些术语!

10个回答

17

Iain,这基本上是一个术语问题,尽管与此问题相关联的“语言无关”的标签,但它与特定编程语言/环境相关。

从设计讨论的角度来看,属性(property)和实例变量(instance variable)可以互换使用,因为其含义是属性是描述对象的数据项。

然而,在特定的编程语言中,这两者有所不同。例如,在C#中,属性(property)实际上是返回对象的函数,而实例变量(instance variable)则是类的非静态成员变量。


3

在这个问题上,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
yz的实例变量,x是一个属性。(通常在定义属性时,会使用一些技巧来模糊关联的实例变量,以便其他代码不能直接访问它。) Python中属性的好处在于,设计人员不需要提前封装所有实例变量,因为将实例变量转换为属性进行未来的封装不应该破坏任何现有的代码(除非代码正在利用你的封装试图修复的漏洞,或者依赖于类检查或其他元编程技术)。
总而言之,这是非常冗长的答案,只是想说在设计层面上谈论属性是很好的。它不关心可能需执行的封装类型。我想这个原则并不是语言无关的,但也适用于Python之外的语言。

3
在Objective-C中,属性是实例变量,可以利用重载的点运算符来调用它的setter和getter。所以,我的.food = "cheeseburger" 实际上被解释为 [my setFood:"cheeseburger"]。这是另一个明确不具有语言通用性的情况,因为Objective-C定义了@property关键字。

2

C#代码示例:

public class ClassName
{
   private string variable;

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

1
也许那是因为你最开始来自C++,对吧?!在我读书的时候,我的教授总是说类属性或类成员。自从我转到Java C#世界后,我开始听说成员。类成员、实例成员...

然后出现了Properties!在Java和.NET中。所以我认为最好称它们为成员。无论它们是实例成员(或者像你所说的实例变量)还是类成员....

干杯!


1
一个属性可以返回一个实例变量,我想大多数情况下都是这样的,但它也可以做更多的事情。你可以在属性中放置逻辑、聚合值或更新其他实例变量等。然而,我认为最好避免这样做。逻辑应该放在方法中。

0
在Java中,我们有一个叫做JavaBeans属性的东西,但它基本上是一个遵循特定命名模式的实例变量,用于其getter和setter。

0
补充一下,在像C#这样的语言中,属性本质上是一个获取和设置函数。因此,它可以具有除获取/设置之外的自定义逻辑。而实例变量则无法做到这一点。

0

属性是与对象相关联的某种数据。例如,圆形的一个属性是直径,另一个属性是面积。

实例变量是存储在对象内部的一段数据。它不一定需要直接对应一个属性。例如(哈哈),圆可能会将其半径存储在实例变量中,并基于该半径计算直径和面积。所有三个变量仍然是属性,但只有半径存储在实例变量中。

一些语言具有“一流”属性的概念。这意味着对于客户端应用程序而言,属性看起来并且像实例变量一样使用。也就是说,您可以写 circle.diameter 代替 circle.getDiameter(),以及写 circle.radius = 5 代替 circle.setRadius(5)


0
与其他回答不同,我认为成员变量和属性之间存在一种与语言无关的有用区别。
这种区别在组件化编程中最为明显,在任何地方都很有用,但最容易在图形界面中理解。在这种情况下,我倾向于将组件的设计时配置看作操作对象的“属性”。例如,通过设置其属性来选择文本输入字段的前景色、背景色、边框样式和字体。虽然这些属性可以在运行时更改,但通常不会这样做。在运行时,另一组变量更有可能被读取和写入,这些变量代表字段的内容。我将此信息视为组件的“状态”。
为什么这种区别很有用?在创建用于连接组件的抽象时,通常只需要公开“状态”变量。回到文本字段示例,您可以声明一个接口,提供对当前内容的访问。但是控制组件外观和感觉的“属性”仅在具体实现类上定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接