Python 类变量和self的理解

看下面代码:

class LineInfo():

Num = 4

def __init__(self):

#self.Num = 1 #Num of ':' + 1

self.len = 2 #len of str before ':' or '\n'

self.LineNum = 3

def say(self1):

self1.Num = 0

LineInfoObj = LineInfo()

print(LineInfoObj.Num)

# LineInfoObj.say()

# print(LineInfoObj.Num)

输出:

4

稍作改动:

class LineInfo():

Num = 4

def __init__(self):

self.Num = 1 #Num of ':' + 1

self.len = 2 #len of str before ':' or '\n'

self.LineNum = 3

def say(self1):

self1.Num = 0

LineInfoObj = LineInfo()

print(LineInfoObj.Num)

# LineInfoObj.say()

# print(LineInfoObj.Num)

输出:

1

再次改动

class LineInfo():

Num = 4

def __init__(self):

self.Num = 1 #Num of ':' + 1

self.len = 2 #len of str before ':' or '\n'

self.LineNum = 3

def say(self1):

self1.Num = 0

LineInfoObj = LineInfo()

print(LineInfoObj.Num)

LineInfoObj.say()

print(LineInfoObj.Num)

输出:

1

0

总结:

self代表对象本身的引用

对象创建时自动调用__init__方法,将类变量Num改为1

调用方法say时将类变量Num改为0

再次改动

class LineInfo():

Num = 4

def __init__(self):

self.Num = 1 #Num of ':' + 1

self.len = 2 #len of str before ':' or '\n'

self.LineNum = 3

def say(self1):

self1.Num = 0

LineInfoObj = LineInfo()

print(LineInfoObj.Num)

LineInfoObj.say()

print(LineInfoObj.Num)

print(LineInfo.Num)

输出值:

1

0

4

原因:self指代的是对象,而不是类,类的变量仍然为原来的值4

类属性传入实例方法:

class CLanguage:

bb = 1

def info(self, b, c):

self.b = CLanguage.bb + b

self.c = c

print(self,"正在学 Python")

print(self.b + c)

obj = CLanguage()

obj.info(2,3)

obj.bb = 10

obj.info(2,3)

obj2 = CLanguage()

obj2.bb = 20

obj.info(2,3)

obj2.info(2,3)

CLanguage.bb = 2

obj.info(2,3)

obj2.info(2,3)

输出:

<__main__.CLanguage object at 0x00000200EBDE5940> 正在学 Python

6

<__main__.CLanguage object at 0x00000200EBDE5940> 正在学 Python

6

<__main__.CLanguage object at 0x00000200EBDE5940> 正在学 Python

6

<__main__.CLanguage object at 0x00000200EBDE59D0> 正在学 Python

6

<__main__.CLanguage object at 0x00000200EBDE5940> 正在学 Python

7

<__main__.CLanguage object at 0x00000200EBDE59D0> 正在学 Python

7

对象属性传入实例方法:

class CLanguage:

bb = 1

def info(self, b, c):

self.b = self.bb + b

self.c = c

print(self,"正在学 Python")

print(self.b + c)

obj = CLanguage()

obj.info(2,3)

obj.bb = 10

obj.info(2,3)

obj2 = CLanguage()

obj2.bb = 20

obj.info(2,3)

obj2.info(2,3)

CLanguage.bb = 2

obj.info(2,3)

obj2.info(2,3)

输出:

<__main__.CLanguage object at 0x00000200EBDE5A30> 正在学 Python

6

<__main__.CLanguage object at 0x00000200EBDE5A30> 正在学 Python

15

<__main__.CLanguage object at 0x00000200EBDE5A30> 正在学 Python

15

<__main__.CLanguage object at 0x00000200EBDE5970> 正在学 Python

25

<__main__.CLanguage object at 0x00000200EBDE5A30> 正在学 Python

15

<__main__.CLanguage object at 0x00000200EBDE5970> 正在学 Python

25

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值