類和實例屬性有什么區別?在以下方面是否有任何有意義的區別:class A(object):
foo = 5 # some default valuev.V.class B(object):
def __init__(self, foo=5):
self.foo = foo如果您正在創建許多實例,那么這兩種樣式在性能或空間要求上有什么不同嗎?當您閱讀代碼時,您是否認為這兩種樣式的含義有很大的不同?
4 回答

肥皂起泡泡
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
提交
取消