python的实例属性和静态属性_python类属性和实例属性

1.大致可以这么看,类属性相当于static属性,而实例属性是一般属性。

2.但是,别跟Java想的一样了。java中static属性用类和对象都可以访问并且修改,无论是谁修改之后,二者访问的那个static属性都一起变,也就是说java中static属性是类和属性公用的,只是提倡用类访问而已。static是一直留在内存中的,如果类AAA有对象b和c,有静态属性static int val=3;

无论用谁修改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 ------&gt这里就不同了

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是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值