Python3 类的属性和方法的参数加不加self的区别

这里会发现t1对ID进行了修改却影响了t2的ID, 这就说明ID属于Test类,而非它的对象,换句话说这个属性是全体Test实例共用的。这是因为self的意思同c++的this指针,它代表了类当前的实例,所以加了self的属性就是类实例的属性,不加就是类的属性,这同c++中静态类变量的含义是一样的。

class Test(object):
    ID = 1
 
    def __init__(self):
        pass
 
    def prtID(self):
        print(self.ID)
    
    def classplusOne(self):
        Test.ID += 1
    
    def ObjplusOne(self):
        self.ID += 1
 
t1 = Test()
t2 = Test()
t1.classplusOne()`

在下面的代码中,在函数classplusOne里面,没有用类的的ID,而是使用的对象的ID,两个类对象不影响。

class Test(object):
    ID = 1
 
    def __init__(self):
        pass # self.ID = 1
 
    def prtID(self):
        print(self.ID)
    
    def classplusOne(self):
        self.ID += 1
    
    def ObjplusOne(self):
        self.ID += 1
 
t1 = Test()
print(t1.ID)
t2 = Test()
print(t2.ID)
t1.classplusOne()
print(t1.ID)
print(t2.ID)

方法中加self的变量可以看成是类的属性,或者是特性。使用方法改变和调用属性,属性改变实例的状态。方法中不加self的变量可以看成一个局部变量,该变量不能被直接引用。

类本身的局部变量(定义在方法以外不以self开头的变量是类本身的局部变量)是可以被直接掉用的,注意这里不是指上面所说的方法内的局部变量(这两个命名空间不同)。如果方法中有有变量与类的局部变量同名,那么方法中的局部变量将会屏蔽类中的局部变量即类中的局部变量不在起作用。

class AAA(object):
    def go(self):
        self.one = 'hello'

class BBB(object):
    def go(self):
        one = 'hello'


a1 = AAA()
a1.go()
a1.one

a2 = AAA()
a2.go()
a2.one

b1 = BBB()
b1.go()
b1.one

self.xxx是全局的,xxx是局部的对于该方法有效,类里面属于类的内部变量

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值