Python类变量和实例变量(类属性和实例属性)

8个月前 (04-28)
无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们。我们可以将类看做一个独立的空间,则类属性其实就是在类体中定义的变量,类方法是在类体中定义的函数。

前面章节提到过,在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下 3 种类型:

  1. 类体中、所有函数之外:此范围定义的变量,称为类属性类变量
  2. 类体中,所有函数内部:以“self.变量名”的方式定义的变量,称为实例属性实例变量
  3. 类体中,所有函数内部:以“变量名=变量值”的方式定义的变量,称为局部变量

不仅如此,类方法也可细分为实例方法、静态方法和类方法,后续章节会做详细介绍。

那么,类变量、实例变量以及局部变量之间有哪些不同呢?接下来就围绕此问题做详细地讲解。

类变量(类属性)

类变量指的是在类中,但在各个类方法外定义的变量。举个例子:

class CLanguage :

# 下面定义了2个类变量

name = "C语言中文网"

add = "http://c.biancheng网站站点" rel="nofollow" />

#使用类名直接调用

print(CLanguage.name)

print(CLanguage.add)

#修改类变量的值

CLanguage.name = "Python教程"

CLanguage.add = "http://c.biancheng网站站点" rel="nofollow" /> C语言中文网
http://c.biancheng网站站点" rel="nofollow" /> 此方式不使用,原因后续会讲)。例如,在 CLanguage 类的外部,添加如下代码:

clang = CLanguage()

print(clang.name)

print(clang.add)

运行程序,结果为:

C语言中文网

http://c.biancheng网站站点" rel="nofollow" />

print("修改前,各类对象中类变量的值:")

clang1 = CLanguage()

print(clang1.name)

print(clang1.add)

clang2 = CLanguage()

print(clang2.name)

print(clang2.add)

print("修改后,各类对象中类变量的值:")

CLanguage.name = "Python教程"

CLanguage.add = "http://c.biancheng网站站点" rel="nofollow" /> 修改前,各类对象中类变量的值:
C语言中文网
http://c.biancheng网站站点" rel="nofollow" />

clang = CLanguage()

CLanguage.catalog = 13

print(clang.catalog)

运行结果为:

13

实例变量(实例属性)

实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。

举个例子:

class CLanguage :

def __init__(self):

self.name = "C语言中文网"

self.add = "http://c.biancheng网站站点" rel="nofollow" />

clang = CLanguage()

print(clang.name)

print(clang.add)

#由于 clang 对象未调用 say() 方法,因此其没有 catalog 变量,下面这行代码会报错

#print(clang.catalog)

clang2 = CLanguage()

print(clang2.name)

print(clang2.add)

#只有调用 say(),才会拥有 catalog 实例变量

clang2.say()

print(clang2.catalog)

运行结果为:

C语言中文网
http://c.biancheng网站站点" rel="nofollow" />

clang = CLanguage()

#clang访问类变量

print(clang.name)

print(clang.add)

clang.name = "Python教程"

clang.add = "http://c.biancheng网站站点" rel="nofollow" /> C语言中文网
http://c.biancheng网站站点" rel="nofollow" />

class CLanguage :

name = " x" #类变量

add = "http://" #类变量

def __init__(self):

self.name = "C语言中文网" #实例变量

self.add = "http://c.biancheng网站站点" rel="nofollow" /> python教程
http://c.biancheng网站站点" rel="nofollow" />

clang.money = 30

print(clang.money)

局部变量

除了实例变量,类方法中还可以定义局部变量。和前者不同,局部变量直接以“变量名=值”的方式进行定义,例如:

class CLanguage :

# 下面定义了一个say实例方法

def count(self,money):

sale = 0.8*money

print("优惠后的价格为:",sale)

clang = CLanguage()

clang.count(100)

通常情况下,定义局部变量是为了所在类方能的实现。需要注意的一点是,局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。