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

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

在以下方面是否有任何有意义的区别:

class A(object):
    foo = 5   # some default value

v.V.

class B(object):
    def __init__(self, foo=5):
        self.foo = foo

如果您正在创建许多实例,那么这两种样式在性能或空间要求上有什么不同吗?当您阅读代码时,您是否认为这两种样式的含义有很大的不同?


慕少森
浏览 1154回答 4
4回答

一只萌萌小番薯

区别在于类上的属性由所有实例共享。实例上的属性是该实例的唯一属性。如果来自C+,类上的属性更像是静态成员变量。

肥皂起泡泡

这里有一个很好的岗,并将其摘要如下。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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python