为了账号安全,请及时绑定邮箱和手机立即绑定

类和实例属性有什么区别?

类和实例属性有什么区别?

慕少森 2019-06-01 14:35:21
类和实例属性有什么区别?在以下方面是否有任何有意义的区别:class A(object):     foo = 5   # some default valuev.V.class B(object):     def __init__(self, foo=5):         self.foo = foo如果您正在创建许多实例,那么这两种样式在性能或空间要求上有什么不同吗?当您阅读代码时,您是否认为这两种样式的含义有很大的不同?
查看完整描述

4 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

区别在于类上的属性由所有实例共享。实例上的属性是该实例的唯一属性。

如果来自C+,类上的属性更像是静态成员变量。


查看完整回答
反对 回复 2019-06-01
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

这里有一个很好的,并将其摘要如下。

class Bar(object):
    ## No need for dot syntax
    class_var = 1

    def __init__(self, i_var):
        self.i_var = i_var## Need dot syntax as we've left scope of class namespaceBar.class_var## 1foo = MyClass(2)## Finds i_var in
         foo's instance namespacefoo.i_var## 2## Doesn't find class_var in instance namespace…## So look's in
          class namespace (Bar.__dict__)foo.class_var## 1


类属性分配

  • 如果通过访问类设置了类属性,则它将覆盖所有实例

    foo = Bar(2)foo.class_var## 1Bar.class_var = 2foo.class_var## 2
  • 如果通过访问实例来设置类变量,它将覆盖该值。只有在这种情况下..这实际上覆盖了类变量,并直观地将其转换为一个可用的实例变量,只有在这种情况下.

    foo = Bar(2)foo.class_var## 1foo.class_var = 2foo.class_var## 2Bar.class_var## 1

什么时候使用class属性?

  • 存储常数..由于类属性可以作为类本身的属性访问,所以使用它们来存储类范围的、特定于类的常量通常是很好的。

    class Circle(object):
         pi = 3.14159
    
         def __init__(self, radius):
              self.radius = radius   
        def area(self):
             return Circle.pi * self.radius * self.radiusCircle.pi## 3.14159c = Circle(10)c.pi## 3.14159c.area()## 314.159
  • 定义默认值..作为一个简单的例子,我们可以创建一个有界列表(即只能容纳一定数量或更少元素的列表),并选择默认上限为10项。

    class MyClass(object):
        limit = 10
    
        def __init__(self):
            self.data = []
        def item(self, i):
            return self.data[i]
    
        def add(self, e):
            if len(self.data) >= self.limit:
                raise Exception("Too many elements")
            self.data.append(e)
    
     MyClass.limit ## 10


查看完整回答
反对 回复 2019-06-01
  • 4 回答
  • 0 关注
  • 1153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信