1.大致可以这么看,类属性相当于static属性,而实例属性是一般属性。
2.但是,别跟Java想的一样了。java中static属性用类和对象都可以访问并且修改,无论是谁修改之后,二者访问的那个static属性都一起变,也就是说java中static属性是类和属性公用的,只是提倡用类访问而已。static是一直留在内存中的,如果类AAA有对象b和c,有静态属性static int val=3;
printform无论用谁修改val,其他方法调用的val都随之改变,因为都对应那个在内存中的值。AAA.val=10;这个时候b.val和c.val都为10。b.val=132;这个时候AAA.val和c.val都是132。所以这样不好,一般就用类来改变这个值。
3.python中,
class CC():
version=1.2 ##直接在类中定义的都是类属性
a=CC()
print a.version #输出1.2
print CC.version #输出1.2
CC.version=1.5
print a.version #输出1.5
print CC.version #输出1.5
a.version=10
print a.version #输出10
print CC.version #输出1.5 ------>这里就不同了
print CC.__dict__#输出{'__module__': '__main__', 'version': 1.5, '__doc__': None}
print a.__dict__#输出{'version': 1.5}
【解释】:其实version本来就是类属性,类可以改变它,对象不能改变(那么a.version=10是什么呢??这就是Python的灵活导致的,python可以随处添加类属性和实例属性,所以这里a是【添加】了实例属性a,但并没有修改类CC的类属性version。当a.version的时候,如果它又version这个实例属性就是这个实例属性的值,如果没有就是类CC的类属性的值。)
那么什么是实例属性呢?
就是初始化__init__中的属性
class CC():
version=1.2
def __init(self,name,password):
self.name=name
self.password=password
这里的self.name和self.password就是实例属性了。
所以这个时候print CC.name就会报错,因为name只是一个实例属性。
没有self修饰的变量是类属性,那么没有self参数的方法就是类方法,即静态方法。
【但是】上面类调用实例属性报错,但是类调用非静态方法(即有self参数)的方法不会报错的。随便一想就合情合理了。
【【【【注意】】】】python中如果以两个下划线为前缀的是私有变量,也就是private的,比如上面如果是__version=10;那么不管是CC.version还是CC.__version还是a.version还是a.__version都错,正如java中静态私有变量,外面(这个public class的外面,并不包括这个class里面的main函数)什么都是访问不了的。
这里要提到java和python一个超级大的不同点。java中东西都是在class里面的,所以会出现一种python中不存在的现象,就是main所在的public的class。它既是一个class,但是里面的东西却和main函数并存,在一个作用范围内。python执行地方时在所有class的外面,所以不会有这个情况。
另外:__version是
类私有变量,如果一个下划线_version就是模块级别私有变量,不能被form CC import _version导入,这个比__version宽松一点,只是上面一层的模块级别限制。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论