Python 类中的变量(或属性)分类以及特点详解 [OOP][类变量][实例变量][局部变量][类属性][实例属性][不同变量各自的特点]

您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

1 类中的变量分类介绍

类体中的属性,指的就是类中的变量。

在类体中,根据变量定义的位置不同,以及定义的方式不同,类中的属性可细分为以下三种类型,如下所示:

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

2 类变量(类属性)

2.1 类变量(类属性)概述

类变量指的是类体中、所有函数之外定义的变量。

举例如下所示:

class User:
    # 定义类变量
    name = '码农阿杰'  # 类变量 name
    age = 28  # 类变量 age

    # 实例方法
    def add_id(self, user_id):
        print('添加用户id的实例方法')

2.2 类变量(类属性)的特点

类变量会被所有类的实例化对象都同时共享。

类变量的调用方式有两种,如下所示,

(1)使用类的实例化对象调用类变量。

  • 通过类对象可以调用所属类中的类变量。此方式不建议使用,因为如果实例变量和类变量同名时,使用类对象将无法调用类变量,它会首选实例变量(实例变量在第 3 小节会介绍。举例也在第 3 小节)。
  • 注意:通过类对象是无法修改类变量的。通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量。

(2)使用类名直接调用类变量。

  • 通过类名不仅可以调用所属类中的类变量,而且可以修改它的值。
  • 通过类名访问类变量之外,还可以动态的为类和对象添加类变量。
  • 注意:因为类变量会被所有类的实例化对象都同时共享,所以,通过类名修改类变量的值,会影响所有的实例化对象。

举例如下所示:
例一,(1)使用类的实例化对象调用。

class User:
    # 定义类变量
    name = '码农阿杰'
    age = 28

    # 实例方法
    def add_id(self, user_id):
        print('添加用户id的实例方法')


# (1)使用类的实例化对象调用类变量。
user = User()  # 类的实例化(创建 User 类的对象)

print('修改前 类变量 name =', user.name)
print('修改前 类变量 age =', user.age)

print('------------------------------')

# 修改类变量的值
user.name = '阿杰'
user.age = 18

print('修改后 类变量 name =', User.name)
print('修改后 类变量 age =', User.age)

print('------------------------------')
# 通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
print('通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量')
print('修改后 类变量 name =', user.name)
print('修改后 类变量 age =', user.age)

运行结果:

修改前 类变量 name = 码农阿杰
修改前 类变量 age = 28
------------------------------
修改后 类变量 name = 码农阿杰
修改后 类变量 age = 28
------------------------------
通过类对象对类变量赋值,其本质将不再是修改类变量的值,而是在给该对象定义新的实例变量
修改后 类变量 name = 阿杰
修改后 类变量 age = 18

例二,(2)使用类名直接调用。

class User:
    # 定义类变量
    name = '码农阿杰'
    age = 28

    # 实例方法
    def add_id(self, user_id):
        print('添加用户id的实例方法')


# (2)使用类名直接调用。
print('修改前 类变量 name =', User.name)
print('修改前 类变量 age =', User.age)

print('------------------------------')

# 修改类变量的值
User.name = '阿杰'
User.age = 18

print('修改后 类变量 name =', User.name)
print('修改后 类变量 age =', User.age)

print('------------------------------')

# 动态的为类和对象添加类变量 gender
User.gender = '男'

print('动态的为类和对象添加类变量 gender =', User().gender)

运行结果:

修改前 类变量 name = 码农阿杰
修改前 类变量 age = 28
------------------------------
修改后 类变量 name = 阿杰
修改后 类变量 age = 18
------------------------------
动态的为类和对象添加类变量 gender =

3 实例变量(实例属性)

3.1 实例变量(实例属性)概述

在任意类方法(构造方法或实例方法)内部以“self.变量名”的方式定义的变量,叫做实例变量(或实例属性)。

举例如下所示:

class User:
    # 构造方法
    def __init__(self):
        self.name = '码农阿杰'  # 实例变量 name
        self.age = 28  # 实例变量 age

    # 实例方法
    def add_id(self):
       self.user_id = 1  # 实例变量 user_id

3.2 实例变量(实例属性)的特点

  • 实例变量只作用于调用方法的对象。
  • 实例变量只能通过对象名访问,无法通过类名访问。
  • 如果实例变量和类变量同名,使用类对象将无法调用类变量,它会首选实例变量,这也是不推荐“类变量使用对象名调用”的原因。
  • 注意:和类变量不同的是,通过某个对象修改实例变量的值,不会影响类的其它实例化对象,更不会影响同名的类变量。

举例如下所示:
例一,实例变量只作用于调用方法的对象。

class User:
    # 构造方法
    def __init__(self):
        self.name = '码农阿杰'
        self.age = 28

    # 实例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 类的实例化(创建 User 类的对象)

# 由于 __init__(self) 构造方法是在创建类对象时自动调用,所以 User 类的类对象都会包含 name 和 age 实例变量
print(user.name)
print(user.age)
# 由于 user_id 实例变量在 add_id(self) 实例方法体中,如果 add_id(self) 实例方法没有被调用,那么 User 类的类对象中是不包含 user_id 实例变量的
print(user.user_id)

运行结果:

码农阿杰
28
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 162, in <module>
    print(user.user_id)
AttributeError: 'User' object has no attribute 'user_id'

例二,实例变量只能通过对象名访问,无法通过类名访问。

class User:
    # 构造方法
    def __init__(self):
        self.name = '码农阿杰'
        self.age = 28

    # 实例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 类的实例化(创建 User 类的对象)
print('使用对象名访问实例变量 name = ', user.name)  # 实例变量只能通过对象名访问
print('使用类名访问实例变量 name = ', User.name)  # 实例变量无法通过类名访问。

运行结果:

使用对象名访问实例变量 name =  码农阿杰
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 158, in <module>
    print('使用类名访问实例变量 name = ', User.name)
AttributeError: type object 'User' has no attribute 'name'

例三,

class User:
    # 定义类变量
    name = '阿杰'
    age = 18
    # 构造方法
    def __init__(self):
        self.name = '码农阿杰'
        self.age = 28

    # 实例方法
    def add_id(self):
       self.user_id = 1


user = User()  # 类的实例化(创建 User 类的对象)

# 如果实例变量和类变量同名,使用类对象将无法调用类变量,它会首选实例变量,
# 这也是不推荐“类变量使用对象名调用”的原因。
print('如果类变量和实例变量同名,通过类对象访问类变量 name = ', user.name)
print('如果类变量和实例变量同名,通过类对象访问类变量 age = ', user.age)

运行结果:

如果类变量和实例变量同名,通过类对象访问类变量 name =  码农阿杰
如果类变量和实例变量同名,通过类对象访问类变量 age =  28

4 局部变量

4.1 局部变量概述

类方法中直接以 “变量名 = 值” 的方式进行定义的变量,叫做局部变量。

举例如下所示:

class User:
    # 实例方法
    def user_info(self):
        name = '码农阿杰'  # 局部变量 name
        age = 28  # 局部变量 age
        print(name, age)
        

4.2 局部变量的特点

局部变量只能用于所在函数中,函数执行完成后,局部变量也会被销毁。

举例如下所示:

class User:
    # 实例方法
    def user_info(self):
        name = '码农阿杰'  # 局部变量 name
        age = 28  # 局部变量 age
        print(name, age)


user = User()
user.user_info()  # 执行 user_info() 方法,输出结果,该方法执行完毕

# 局部变量 name 和 age ,只能用于所在方法中,方法执行完毕后,局部变量也会被销毁。
print(user.name)
print(user.age)

运行结果:

码农阿杰 28
Traceback (most recent call last):
  File "D:/Data/ProfessionalSkills/Python/PycharmProjects/demo/demo.py", line 156, in <module>
    print(user.name)
AttributeError: 'User' object has no attribute 'name'

【友情链接】

微信公众号:码农阿杰

博客园

【参考资料】

Python 官网

Python 3.8.2 documentation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章