Python 面向对象编程:类与实例的基础构建
类的定义与实例化
在 Python 中,类(Class)是创建对象的模板。通过类,我们可以将数据和处理数据的方法封装在一起。定义一个基础类非常简单:
class DeviceConfig:
protocol = "HTTPS"
def reset(self):
print("Configuration has been reset.")
上述代码定义了一个名为 DeviceConfig 的类。它创建了一个新的命名空间,其中包含变量 protocol 和函数 reset。类对象主要支持两种操作:属性引用和实例化。
属性引用
属性引用遵循标准的 object.attribute 语法。例如,我们可以直接通过类名访问其定义的属性:
# 访问类变量
print(DeviceConfig.protocol)
# 访问类中定义的函数对象
print(DeviceConfig.reset)
实例化操作
类的实例化类似于函数调用。执行实例化会创建一个该类的实例对象:
# 创建实例对象
my_device = DeviceConfig()
实例对象与方法调用
实例对象不仅可以引用类中定义的属性,还可以拥有自己独特的属性。属性分为数据属性和方法。
数据属性的动态性
实例对象可以随时绑定新的属性,这不会影响类或其他实例:
client = DeviceConfig()
client.ip_address = "192.168.1.1"
print(client.ip_address)
# 删除实例属性
del client.ip_address
方法与 self 的含义
在类中定义的函数通常被称为"方法"。在调用实例方法时,Python 会自动将实例对象本身作为第一个参数传入,这个参数习惯上命名为 self。
# 调用方法
client.reset()
# 上述调用在底层等价于:
DeviceConfig.reset(client)
这种机制保证了方法能够访问并操作特定实例的数据。
构造方法 __init__ 的应用
为了让实例在创建时就具备初始状态,通常会定义 __init__ 特殊方法。当类被实例化时,该方法会自动执行。
class Member:
def __init__(self, username, level):
# 绑定到 self 的变量是实例属性
self.username = username
self.level = level
def show_info(self):
print(f"User: {self.username}, Level: {self.level}")
# 实例化时传递参数
user1 = Member("Alice", 5)
user2 = Member("Bob", 3)
user1.show_info()
user2.show_info()
每个实例对象在内存中都有独立的地址,它们的实例属性互不干扰。user1 和 user2 虽然由同一个类创建,但它们是两个完全不同的实体。
类属性与实例属性的区别
理解属性的作用域对于掌握面向对象至关重要。类属性由所有实例共享,而实例属性则是每个对象私有的。
class WebServer:
# 类属性:所有实例共享
active_connections = 0
def __init__(self, server_id):
# 实例属性:每个对象独有
self.server_id = server_id
WebServer.active_connections += 1
def report(self):
print(f"Server ID: {self.server_id}")
print(f"Total Connections: {WebServer.active_connections}")
node1 = WebServer("Node-A")
node1.report()
node2 = WebServer("Node-B")
node2.report()
在这个例子中,server_id 是实例属性,每个服务器节点都有自己的 ID;而 active_connections 是类属性,用于跟踪所有实例共用的全局状态。
搜索机制
当访问一个实例属性时,Python 的搜索顺序如下:
- 首先在当前的实例空间中查找该属性。
- 如果没找到,则前往创建该实例的类空间中查找。