在Python的面向对象编程中,类是一种重要的编程机制,用于定义对象的属性和方法。在类体中,根据变量定义的位置不同,以及定义的方式不同,类属性又可细分为以下3种类型:
类体中,所有函数内部:以“self.变量名=变量值”的方式定义的变量,称为实例变量或实例属性;
类体中,所有函数之外:此范围定义的变量,称为类变量或类属性;
类体中,所有函数内部:直接以“变量名=变量值”的方式定义的变量,称为局部变量。
1、实例变量(实例属性)
在前面的教程中,我们已经简单介绍了定义在类的方法中的变量,也就是实例变量,并且通常位于类的构造函数_init_()中。实例变量指的是在任意类方法内部,以“self.变量名”的方式定义的变量,其特点是只作用于调用方法的对象。另外,实例变量只能通过对象名访问,无法通过类名访问。例如:
动手练一练:
class Content:
def __init__(self):
self.name = "Python在线教程"
self.address = "www.pyhint.com"
def count(self):
self.page = 25
content = Content()
print(content.name) # 输出 Python在线教程
print(content.address) # 输出 www.pyhint.com
print("-------这是虚线-------")
#只有调用count(),才会拥有page实例变量
content.count()
print(content.page) # 输出 25
执行以上代码,输出结果为:
Python在线教程
www.pyhint.com
-------这是虚线-------
25
上面的例子中可以看到,在Content类中,name、address以及page都是实例变量。其中,由于_init_()构造函数在创建类对象时会自动调用该方法,因此,Content类的类对象都会包含name和address实例变量,而只有调用了count()方法的类对象,才包含page实例变量。
Python不仅支持修改实例变量的值,还支持为特定的对象添加实例变量,例如:
动手练一练:
class Content:
def __init__(self):
self.name = "Python在线教程"
self.address = "www.pyhint.com"
content = Content()
print(content.name) # 输出 Python在线教程
print(content.address) # 输出 www.pyhint.com
print("-------这是虚线-------")
#更改content对象中实例变量的值
content.name = "PHP教程"
content.address = "pyhint.com"
#为content对象添加page实例变量
content.page = 25
print(content.name) # 输出 PHP教程
print(content.address) # 输出 pyhint.com
print(content.page) # 输出 25
执行以上代码,输出结果为:
Python在线教程
www.pyhint.com
-------这是虚线-------
PHP教程
pyhint.com
25
上面的例子中,我们修改了content对象中实例变量name和address的值,而且还为content对象添加page实例变量。
2、类变量(类属性)
类变量指的是在类的内部定义的,但在各个类方法外定义的变量。例如:
动手练一练:
class Content:
# 下面定义了两个类变量
name = "Python在线教程"
address = "www.pyhint.com"
# 下面定义了一个count实例方法
def count(self):
print("你好!")
print(Content.name) # 输出 Python在线教程
print(Content.address) # 输出 www.pyhint.com
print("-------这是虚线-------")
#通过类的实例化对象调用
content = Content()
print(content.name) # 输出 Python在线教程
print(content.address) # 输出 www.pyhint.com
执行以上代码,输出结果为:
Python在线教程
www.pyhint.com
-------这是虚线-------
Python在线教程
www.pyhint.com
上面的例子中,name和address就是属于两个类变量,我们不仅可以使用Content类名直接调用,也可以使用类的实例化content对象调用。
类变量的特点是,所有类的实例化对象都同时共享的变量,也就是说,类变量在所有实例化对象中是作为公用资源存在的。我们不仅可以调用类变量,也可以修改它的值。但是这里需要注意的是,因为类变量为所有实例化对象共有,通过类名修改类变量的值,会影响所有的实例化对象。例如:
动手练一练:
class Content:
# 下面定义了两个类变量
name = "Python在线教程"
address = "www.pyhint.com"
# 下面定义了一个count实例方法
def count(self):
print("你好!")
#通过类的实例化对象调用
content = Content()
print(content.name) # 输出 Python在线教程
print(content.address) # 输出 www.pyhint.com
print("-------修改类变量的值后-------")
#修改类变量的值
Content.name = "PHP"
Content.address = "pyhint.com"
print(content.name) # 输出 PHP
print(content.address) # 输出 pyhint.com
执行以上代码,输出结果为:
Python在线教程
www.pyhint.com
-------修改类变量的值后-------
PHP
pyhint.com
上面的例子中,通过类名修改类变量,会作用到所有的实例化对象。
除了可以通过类名访问和修改类变量之外,还可以动态地为类和对象添加类变量。例如:
动手练一练:
class Content:
# 下面定义了两个类变量
name = "Python在线教程"
address = "www.pyhint.com"
# 下面定义了一个count实例方法
def count(self):
print("你好!")
#添加类变量
Content.count = 25
print(Content.count) # 输出 25
执行以上代码,输出结果为:
25
上面的例子中,我们成功添加类变量count。但是这里需要注意的是,实例中不能修改类变量。如果通过实例对类变量进行修改,Python解释器会新建一个同名的实例变量来代理实例中的类变量。
3、局部变量
除了实例变量,类方法中还可以定义局部变量。和实例变量不同,局部变量直接以“变量名=值”的方式进行定义,例如:
动手练一练:
class Market:
def sell(self, money):
count = 0.7 * money
print("打折促销价格为:", count)
market = Market()
market.sell(100)
执行以上代码,输出结果为:
打折促销价格为: 70.0
上面的例子中,“count”就是局部变量,通常情况下,定义局部变量是为了所在类方法功能的实现。但是这里需要注意的是,局部变量只能在该函数中访问它们,如果试图在超出范围的地方访问,则会出现错误,因为局部变量是在函数体内部临时保存的数据,即当函数调用完成后,局部变量就会被销毁,所以无法在其他范围内被调用。