惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Security Latest
Security Latest
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Stack Overflow Blog
Stack Overflow Blog
WordPress大学
WordPress大学
N
Netflix TechBlog - Medium
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
宝玉的分享
宝玉的分享
博客园 - 【当耐特】
C
Cyber Attacks, Cyber Crime and Cyber Security
雷峰网
雷峰网
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
T
Threat Research - Cisco Blogs
NISL@THU
NISL@THU
Spread Privacy
Spread Privacy
P
Proofpoint News Feed
J
Java Code Geeks
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MyScale Blog
MyScale Blog
T
Tor Project blog
P
Proofpoint News Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
MongoDB | Blog
MongoDB | Blog
Simon Willison's Weblog
Simon Willison's Weblog
C
Cybersecurity and Infrastructure Security Agency CISA
L
LINUX DO - 热门话题
小众软件
小众软件
G
GRAHAM CLULEY
P
Privacy International News Feed
AWS News Blog
AWS News Blog
Know Your Adversary
Know Your Adversary
P
Palo Alto Networks Blog
人人都是产品经理
人人都是产品经理
S
Schneier on Security
Scott Helme
Scott Helme
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
B
Blog RSS Feed
T
The Exploit Database - CXSecurity.com
Recent Announcements
Recent Announcements
E
Exploit-DB.com RSS Feed
C
CXSECURITY Database RSS Feed - CXSecurity.com
U
Unit 42
The Register - Security
The Register - Security
S
Securelist
Martin Fowler
Martin Fowler
Project Zero
Project Zero
大猫的无限游戏
大猫的无限游戏
Cisco Talos Blog
Cisco Talos Blog

博客园 - 梦徒

K8s节点NotReady恢复方法 GPU和CPU的知识 K8s 集群巡检项整理 K8s运维的核心能力建设 Ceph 分布式存储系统 VMware备份接口 股市布林线(BOLL)指标三条线的使用技巧 Python 数据分析入门|02:Pandas 数据清洗:缺失值/重复值/异常值处理 Python 数据分析入门|01 Pandas 基础:1 行代码读取 Excel/Csv文件 python f-string格式化输出 Python数据分析利器-Pandas数据处理-筛选与排序 Python数据分析利器-Pandas 简介 python-分割文件名及后缀 python类及三大特性 Python 必背内置函数 python常用数据结构之字典 MQ三巨头RocketMQ、Kafka、RabbitMQ 选型 一文搞懂 Redis 的三种集群方案 VMware ESXi 磁盘置备类型详解 Linux 实例:配置 NTP 服务 Kubernetes 运维必备之常用命令总结 Kubernetes + CI/CD 全流程指南!实现自动化部署 Linux Redhat 7.9 下 Docker 离线安装部署
Python 类的属性和方法详解
梦徒 · 2025-11-13 · via 博客园 - 梦徒

  在 Python 的面向对象编程(OOP) 中,类(Class) 和 对象(Object) 是核心概念,而属性(Attribute) 和 方法(Method) 是类的基本组成部分。Python 允许在类中定义不同类型的属性(实例属性、类属性)和方法(实例方法、类方法、静态方法),通过它们,可以高效地组织代码,提高代码的模块化、可读性和复用性。本文将详细介绍 Python 中类的属性和方法,并结合示例帮助你理解和掌握它们的用法。

1. Python 类的属性(Attributes)

(1)实例属性(Instance Attribute)

实例属性 是属于对象(实例)的变量,每个对象的实例属性相互独立。

  • 通过 self.属性名 定义,在 __init__() 方法中初始化。
  • 只能通过对象访问,不会影响其他实例。

示例:实例属性的定义和使用

class Person:
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

# 创建对象
p1 = Person("小明", 25)
p2 = Person("小红", 22)

# 访问实例属性
print(p1.name, p1.age)  # 输出:小明 25
print(p2.name, p2.age)  # 输出:小红 22

# 修改实例属性(不会影响其他对象)
p1.age = 26
print(p1.age)  # 输出:26
print(p2.age)  # 输出:22(不变)

✅ 总结:

  • 每个实例对象都有自己的实例属性,互不影响。
  • self 关键字 代表实例本身,self.name 和 self.age 绑定到具体的对象。

(2)类属性(Class Attribute)

类属性 是属于整个类的变量,所有对象共享同一个类属性。

  • 通过 类名.属性名 定义,所有实例对象共享该属性。
  • 修改类属性会影响所有对象,但修改实例属性不会影响类属性。

示例:类属性的定义和使用

class Student:
    school = "Python大学"  # 类属性(所有实例共享)

    def __init__(self, name):
        self.name = name  # 实例属性

# 创建对象
s1 = Student("张三")
s2 = Student("李四")

# 访问类属性
print(s1.school)  # 输出:Python大学
print(s2.school)  # 输出:Python大学

# 修改类属性(影响所有实例)
Student.school = "编程学院"
print(s1.school)  # 输出:编程学院
print(s2.school)  # 输出:编程学院

# 修改实例的类属性(仅影响当前对象)
s1.school = "Python学院"
print(s1.school)  # 输出:Python学院
print(s2.school)  # 输出:编程学院  (未受影响)

✅ 总结:

  • 类属性由所有对象共享,适用于全局性信息(如学校名称)。
  • 实例属性属于单个对象,修改不会影响其他对象。
  • 如果实例对象尝试修改类属性,它会创建一个新的实例属性,而不会影响原类属性。

2. Python 类的方法(Methods)

(1)实例方法(Instance Method)

实例方法 是最常见的方法类型:

✅ 第一个参数必须是 self,代表实例对象本身。

✅ 可以访问实例属性和类属性。

✅ 只能通过实例调用。

示例:实例方法的定义和使用

class Dog:
    def __init__(self, name):
        self.name = name  # 实例属性

    def bark(self):  # 实例方法
        return f"{self.name} 叫了一声:汪汪!"

# 创建对象
dog1 = Dog("旺财")
dog2 = Dog("小白")

# 调用实例方法
print(dog1.bark())  # 输出:旺财 叫了一声:汪汪!
print(dog2.bark())  # 输出:小白 叫了一声:汪汪!

✅ 总结:

  • 实例方法用于操作实例数据,必须通过实例调用。
  • self 代表实例本身,可以访问实例属性。

(2)类方法(Class Method)

类方法 操作类属性,对所有实例生效。

✅ 使用 @classmethod 装饰器 定义。

✅ 第一个参数必须是 cls,代表类本身。

✅ 可以通过 cls.类属性 访问和修改类属性。

示例:类方法的定义和使用

class Animal:
    species = "哺乳动物"  # 类属性

    @classmethod
    def change_species(cls, new_species):
        cls.species = new_species  # 修改类属性

# 访问类方法
print(Animal.species)  # 输出:哺乳动物
Animal.change_species("爬行动物")
print(Animal.species)  # 输出:爬行动物

✅ 总结:

    • 类方法修改类属性,影响所有实例。
    • 使用 cls 访问类属性,而不是 self
    • 可以通过 类名.类方法() 直接调用,无需创建实例。

(3)静态方法(Static Method)

静态方法 是独立的工具方法,既不操作实例,也不操作类,仅提供功能。

✅ 使用 @staticmethod 装饰器 定义。

✅ 没有 self 或 cls 参数,不能访问实例属性或类属性。

✅ 适用于不依赖类和实例的独立功能。

示例:静态方法的定义和使用

class MathHelper:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def multiply(x, y):
        return x * y
# 直接调用静态方法(无需创建对象)
print(MathHelper.add(5, 3))     # 输出:8
print(MathHelper.multiply(4, 6)) # 输出:24

类中静态方法的使用,直接调用静态方法,而无需创建对象.

#!/usr/bin/env python
#coding:utf-8

policy = {
    "times": "2025-07-24",
    "hostname": "nginx-server01",
    "IP_Adress": "10.50.1.33",
    "details": {
        "nginx-server01_10.50.1.33_vm": [
            "Server type:           web01",
            "Active:                yes",
            "System:                Vmware"
            ]
    }
}
class PolicyParser:
    def __init__(self):
        self.all_results = {}
    def extract_info(self):
        for key,value in policy.get('details',{}).items():
            # print(f'key: {key}: value: {value}')
            #暂未用到标识符
            unique_key = f'{policy.get('hostname')}_{policy.get('IP_Adress')}'
            #print(unique_key)
        #这一步时调用类的静态方法.
            parsed = self.parse_details(value)
            self.all_results = {
                "IP地址": policy.get('IP_Adress'),
                "主机名": policy.get('hostname'),
                "创建时间": policy.get('times'),
                "服务类型": parsed.get('Server type',"N/A"),
                "服务状态": parsed.get('Active',"N/A"),
                "操作系统": parsed.get('System',"N/A"),
            }
        #print(f'打印出 all_results的值: {self.all_results}')
        return self.all_results
    @staticmethod
    def parse_details(details):
        fields = {}
        for line in details:
            strip_line = line.strip()
            if not strip_line or ":" not in strip_line:
                continue
            key_part,value_part = strip_line.split(':',1)
            key = key_part.strip()
            value = value_part.strip()
            if key == "Server type":
                fields['Server type'] = value
            elif key == "Active":
                fields['Active'] = value
            elif key == "System":
                fields['System'] = value
        #print(f'fields字典中的值: {fields}')
        return fields
    def print_summary(self):
        """打印摘要信息"""
        print(f"成功找到 {policy.get('hostname')}主机,信息如下:")
        # 按主机名统计主机信息
        for k,v in self.all_results.items():
            print(f'{k}: {v}')
obj = PolicyParser()
obj.extract_info()
obj.print_summary()

✅ 总结:

  • 静态方法适合独立计算或工具方法,如数学运算、字符串处理等。
  • 不能访问 self 和 cls,不能修改实例或类属性。
  • 可以通过 类名.静态方法() 直接调用,无需创建实例。

3. 结论

类别定义方式参数访问范围调用方式
实例属性 self.属性名 self 仅限实例 对象.属性名
类属性 类名.属性名 cls 所有实例共享 类名.属性名
实例方法 def 方法(self): self 可访问实例和类属性 对象.方法()
类方法 @classmethod cls 仅访问类属性 类名.方法()
静态方法 @staticmethod 不能访问实例和类属性 类名.方法()

Python 的类的属性和方法提供了丰富的功能,使得代码更具灵活性、可读性和可维护性。通过合理使用 实例属性、类属性、实例方法、类方法和静态方法,可以编写更清晰、更高效的 OOP 代码!

参考文档:https://zhuanlan.zhihu.com/p/1890499862375675316