代码之家  ›  专栏  ›  技术社区  ›  Iain

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

  •  7
  • Iain  · 技术社区  · 15 年前

    我想我一直在使用这些术语,相互间的/错误的!

    10 回复  |  直到 15 年前
        1
  •  17
  •   erickson    15 年前

    伊恩,这基本上是一个术语问题,尽管与这个问题相关联的“语言不可知论”标签非常与语言/环境相关。

    为了便于设计讨论,属性和实例变量可以互换使用,因为其思想是属性是描述对象的数据项。

    当谈论一种特定的语言时,这两种语言可能是不同的。例如,在C中,属性实际上是返回对象的函数,而实例变量是类的非静态成员变量。

        2
  •  3
  •   David Berger    15 年前

    Hershi认为这是语言特有的。但要添加到语言特定答案的跟踪中:

    在Python中,实例变量是实例的一个属性,(通常)实例字典中引用的属性。这与爪哇中的成员或实例变量类似,只是所有的内容都是公开的。

    属性是指向getter/setter方法的快捷方式, 看起来就像一个实例变量 . 因此,在下面的类定义中(从guido的 new style object manifesto ):

    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中属性的好处在于,设计器不必预先封装所有实例变量,因为将来通过转换instan进行封装。属性的CE变量不应破坏任何现有代码(除非代码利用封装试图修复的漏洞,或者依赖类检查或其他元编程技术)。

    所有这些都是一个很长的答案,可以说在设计级别,谈论属性是很好的。对于您可能需要执行哪种类型的封装,这是不可知的。我想这个原则不是语言不可知论,而是适用于Python旁边的语言。

        3
  •  2
  •   Tony    15 年前

    在C中完成的代码示例#

    public class ClassName
    {
       private string variable;
    
       public string property
       {
          get{ return variable; }
          set { variable = value; }
       }
    }
    
        4
  •  2
  •   Nick Van Brunt    15 年前

    在目标C中,属性是一个实例变量,它可以利用重载的点运算符来调用其setter和getter。所以my.food=“Cheesburger”实际上被解释为[我的setfood:“Cheesburger”]。这是另一种情况,因为objective-c定义了@property关键字,所以定义绝对不是语言无关的。

        5
  •  1
  •   Txugo    15 年前

    也许是因为你最初来自C++,对吧?! 在我上学的时候,我有很多教授一直在说班级财产或班级财产。自从我搬到爪哇C世界,我就开始听有关成员的事了。类成员、实例成员…

    然后属性apear!在Java和.NET中。所以我认为你最好叫它成员。无论它们是实例成员(或您称之为实例变量)还是类成员…

    干杯!

        6
  •  1
  •   Adam Asham    15 年前

    一个属性可以返回一个实例变量,我认为大多数情况下都可以,但它可以做得更多。您可以将逻辑放入属性、聚合值或更新其他实例变量等。不过,我认为最好避免这样做。逻辑应该进入方法。

        7
  •  0
  •   willcodejavaforfood    15 年前

    在爪哇,我们有一种叫做 JavaBeans Properties ,但这基本上是一个实例变量,它遵循其getter和setter的特定命名模式。

        8
  •  0
  •   Jacob Adams    15 年前

    在加上前面所说的,在C这样的语言中,属性本质上是一个get-and-set函数。因此,除了获取/设置之外,它还可以有运行的自定义逻辑。实例变量不能这样做。

        9
  •  0
  •   Adam Jaskiewicz    15 年前

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

    实例变量是存储在对象中的一段数据。它不需要直接与属性对应。例如(heh),圆可以将其半径存储在实例变量中,并根据该半径计算其直径和面积。这三个都是属性,但只有半径存储在实例变量中。

    有些语言有“第一类”属性的概念。这意味着对于客户机应用程序,属性看起来和使用起来就像一个实例变量。也就是说,不是写 circle.getDiameter() ,你会写 circle.diameter ,而不是 circle.setRadius(5) ,你会写 circle.radius = 5 .

        10
  •  0
  •   erickson    15 年前

    与给出的其他答案相比,我 认为成员变量和语言不可知的属性之间有一个有用的区别。

    这种区别在面向组件的编程中最明显,它在任何地方都很有用,但在图形用户界面中最容易理解。在这种情况下,我倾向于认为组件的设计时配置是操作对象的“属性”。例如,我通过设置文本输入字段的属性来选择其前景和背景颜色、边框样式和字体。而这些属性 能够 在运行时进行更改,通常不会。在运行时,表示字段内容的另一组变量更有可能被读取和写入。我认为这个信息是组件的“状态”。

    为什么这种区别有用?当为连接组件创建抽象时,通常只需要暴露“状态”变量。回到文本字段示例,您可以声明一个提供对当前内容访问的接口。但是控制组件外观的“属性”只在具体的实现类上定义。