当前位置:首页 > 技术 > 正文内容

Python 面向对象编程:类与实例的基础构建

访客 技术 2026年6月5日 1

类的定义与实例化

在 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()

每个实例对象在内存中都有独立的地址,它们的实例属性互不干扰。user1user2 虽然由同一个类创建,但它们是两个完全不同的实体。

类属性与实例属性的区别

理解属性的作用域对于掌握面向对象至关重要。类属性由所有实例共享,而实例属性则是每个对象私有的。

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 的搜索顺序如下:

  1. 首先在当前的实例空间中查找该属性。
  2. 如果没找到,则前往创建该实例的类空间中查找。
如果类中存在同名的变量,实例属性会覆盖类属性的访问。这种层次化的查找机制是 Python 实现多态和继承的基础。

标签: Python

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。