类和实例属性有什么区别?在以下方面是否有任何有意义的区别:class A(object):
foo = 5 # some default valuev.V.class B(object):
def __init__(self, foo=5):
self.foo = foo如果您正在创建许多实例,那么这两种样式在性能或空间要求上有什么不同吗?当您阅读代码时,您是否认为这两种样式的含义有很大的不同?
4 回答
![?](http://img1.sycdn.imooc.com/5458626a0001503602200220-100-100.jpg)
肥皂起泡泡
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
添加回答
举报
0/150
提交
取消