Python面向对象中类变量和实例变量(第6节)


在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”就是局部变量,通常情况下,定义局部变量是为了所在类方法功能的实现。但是这里需要注意的是,局部变量只能在该函数中访问它们,如果试图在超出范围的地方访问,则会出现错误,因为局部变量是在函数体内部临时保存的数据,即当函数调用完成后,局部变量就会被销毁,所以无法在其他范围内被调用。