首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >属性是类属性还是实例属性?

属性是类属性还是实例属性?
EN

Stack Overflow用户
提问于 2017-06-27 21:35:06
回答 1查看 233关注 0票数 0

简单地说是Python的

属性是具有特殊功能的实例属性。..。 以下是定义只读属性的一种方法: 类矩形(对象):def __init__(自定义,宽度,高度):self.width = width self.height = height get_area(self):返回self.width * self.height area =属性(get_area,doc=‘该矩形的区域’) 类矩形的每个实例r都有一个合成的只读属性r.area,在方法r.get_area()中通过乘以边来动态计算。

属性是类属性还是实例属性?

  1. 上面的引号是否意味着属性是实例属性?
  2. 属性总是在类的定义中定义,属性也是类属性。
  3. Rectangle.__dict__是否存储类属性,而Rectangle实例的__dict__是否存储实例属性?如果是,下面是否显示该属性是一个类属性,而不是一个实例属性:
代码语言:javascript
复制
>>> Rectangle.__dict__    
mappingproxy({..., 'area': <property object at 0x7f34f7ee2818>})
>>> r=Rectangle(2,3)
>>> r.__dict__    {'width': 2, 'height': 3} 
EN

回答 1

Stack Overflow用户

发布于 2017-06-27 22:13:13

property对象本身是一个类属性,正如它在类体中的位置所暗示的那样;您仍然可以访问实例上的类属性,但反之亦然。

使该属性不同的是描述符协议;在访问r.area的情况下,会发生以下情况(大致如此):

  • Python在实例上查找属性,但找不到;然后
  • Python查找实例类型上的属性,并找到它;然后
  • Python发现结果值实现了__get__,因此;
  • Python使用实例和类调用该方法。

因此,实际调用的是:

代码语言:javascript
复制
Rectangle.area.__get__(r, Rectangle)

这就是属性描述符访问实例的状态的方式,而实际上是类上的一个属性;实例被传递给它。可以看出它是一个类属性,因为它在类上是可访问的,而不需要创建任何实例:

代码语言:javascript
复制
>>> Rectangle.area
<property object at 0x...>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44790323

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档