Python 入门教程(7)面向对象 | 7.2、成员变量


前言:

在Python的面向对象编程(OOP)中,变量可以分为两大类:实例变量和类变量。这两类变量在定义、作用域和用途上有所不同,理解它们之间的区别对于编写清晰、可维护的Python代码至关重要。

一、成员变量

1、成员变量的类型

Python是一种动态类型语言,这意味着变量的类型在运行时确定,而不是在编译时。因此,Python中的成员变量可以存储任何类型的数据,包括数字、字符串、列表、字典、元组、集合以及自定义的类实例等。

  • 基本数据类型: 如整数(int)、浮点数(float)、布尔值(bool)和字符串(str)。
  • 复合数据类型: 如列表(list)、元组(tuple)、字典(dict)和集合(set)。
  • 对象: 可以是Python中任何类的实例。

2、实例变量

实例变量是定义在类的实例中的变量,它们属于类的单个实例,每个实例都可以拥有自己独立的实例变量副本。实例变量通常在类的初始化方法__init__中定义,但也可以在实例的任何方法中定义或修改

2.1、定义实例变量

  • __init__方法中定义:
class Person:  
    def __init__(self, name, age):  
        self.name = name  # 实例变量  
        self.age = age    # 实例变量  
  
# 创建Person类的两个实例  
person1 = Person("Alice", 30)  
person2 = Person("Bob", 25)  
  
# 访问实例变量  
print(person1.name)  # 输出: Alice  
print(person2.age)   # 输出: 25
  • 在实例创建后添加:

成员变量也可以在类的实例被创建后,通过直接赋值的方式添加或修改。

person1.email = "alice@example.com"

注意: 官方推荐的方法是在__init__中定义实例变量,虽然,在其他成员方法中也可以定义成员变量。

2.2、访问实例变量

访问成员变量同样简单,只需使用点(.)操作符和实例名称来引用它们。

print(person1.name)  # 输出: Alice  
print(person1.age)   # 输出: 30  
print(person1.email) # 输出: alice@example.com

2.3、删除实例变量

在Python中,可以使用del语句来删除实例变量与类变量。

del person1.age  
try:  
    print(person1.age)  
except AttributeError:  
    print("Age attribute has been deleted")  
# 输出: Age attribute has been deleted

3、类变量

类变量是定义在类级别上的变量,它们属于类本身,而不是类的任何特定实例。类变量被类的所有实例共享,任何实例对类变量的修改都会影响到其他实例。

3.1、定义类变量

类变量通常在类定义中直接定义,而不是在__init__方法中。

class Person:  
    species = "Human"  # 类变量  
  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
# 访问类变量  
print(Person.species)  # 输出: Human  
  
# 通过实例访问类变量(通常不推荐,因为不够明确)  
print(person1.species)  # 输出: Human

3.2、访问类变量

  • 通过类名访问:

最直接访问类变量的方式是直接通过类名来访问。这种方式清晰明了,表明了变量的作用域和用途。

class MyClass:  
    class_var = "I am a class variable"  
  
    def __init__(self):  
        pass  
  
# 通过类名直接访问类变量  
print(MyClass.class_var)  # 输出: I am a class variable
  • 通过实例访问:

虽然类变量是定义在类级别上的,但我们也可以通过类的任何实例来访问它们。然而,通过实例访问类变量可能不是最佳实践,因为它可能会让人误以为是实例变量。不过,在Python中这是完全合法的。

# 创建MyClass的一个实例  
obj = MyClass()  
  
# 通过实例访问类变量  
print(obj.class_var)  # 输出: I am a class variable

3.3、修改类变量

由于类变量是共享的,所以无论是通过类名还是实例来修改类变量,都会影响到所有实例。

# 通过类名修改类变量  
MyClass.class_var = "I am modified"  
  
# 通过实例访问修改后的类变量  
print(obj.class_var)  # 输出: I am modified  
  
# 再次通过类名访问修改后的类变量  
print(MyClass.class_var)  # 输出: I am modified

4、注意事项

  • 作用域: 实例变量仅在其所属的实例中可用,而类变量则在整个类中可用,包括所有实例。
  • 共享性: 由于类变量被所有实例共享,因此修改类变量会影响到所有实例。这可能导致意外的行为,特别是当多个实例尝试独立地修改类变量时。
  • 初始化: 实例变量通常在__init__方法中初始化,而类变量则在类定义中直接初始化。
  • 访问: 虽然可以通过实例访问类变量,但通常建议直接通过类名来访问类变量,以保持代码的清晰性和意图的明确性。

5、总结

实例变量和类变量在Python的面向对象编程中扮演着不同的角色。理解它们之间的区别和用法,有助于编写更加清晰、可维护和可扩展的Python代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值