Python编程实战—面向对象与进阶语法 | 属性与方法

一、引言:类的核心------属性与方法

在面向对象编程(OOP)中,类(Class) 是一个"蓝图",而属性(Attribute)方法(Method) 是这张蓝图的组成部分。

  • 属性代表对象的"特征"------是什么;
  • 方法代表对象的"行为"------能做什么。

例如,一辆汽车有颜色、品牌、速度(属性),能启动、加速、刹车(方法)。 属性和方法共同定义了对象的状态与功能。


二、属性(Attribute)

1. 属性的分类

在 Python 中,属性分为两类:

类型 定义位置 说明
实例属性 __init__() 中定义 属于对象自身,每个对象独立
类属性 在类体中定义 属于整个类,所有对象共享

2. 实例属性示例

实例属性一般在构造函数 __init__ 中定义:

python 复制代码
class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color

my_car = Car("Tesla", "红色")
print(my_car.brand)  # Tesla
print(my_car.color)  # 红色

每个对象都有自己的属性值,互不影响。

python 复制代码
car1 = Car("BYD", "蓝色")
car2 = Car("BMW", "黑色")

print(car1.brand)  # BYD
print(car2.brand)  # BMW

3. 类属性示例

类属性通常定义在类体中,所有对象共享。

python 复制代码
class Dog:
    species = "犬科动物"  # 类属性

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

dog1 = Dog("旺财")
dog2 = Dog("小黑")

print(dog1.species, dog2.species)  # 犬科动物 犬科动物

如果修改类属性,会影响所有实例:

python 复制代码
Dog.species = "哺乳动物"
print(dog1.species)  # 哺乳动物

但如果在实例上单独赋值,会"遮蔽"类属性:

python 复制代码
dog1.species = "宠物狗"
print(dog1.species)  # 宠物狗
print(dog2.species)  # 哺乳动物

三、方法(Method)

方法定义了类或对象可以执行的操作。

1. 方法的种类

方法类型 装饰器 第一个参数 调用方式 说明
实例方法 self 对象调用 操作实例数据
类方法 @classmethod cls 类或对象调用 操作类数据
静态方法 @staticmethod 类或对象调用 工具函数,与类逻辑相关但不依赖实例

2. 实例方法

实例方法是最常用的方法,用于操作对象属性。

python 复制代码
class Student:
    def __init__(self, name, score):
        self.name = name
        self.score = score

    def show_info(self):
        print(f"学生:{self.name},成绩:{self.score}")

stu = Student("小明", 95)
stu.show_info()

输出:

复制代码
学生:小明,成绩:95

3. 类方法

类方法使用装饰器 @classmethod 定义,第一个参数是 cls,表示类本身。 常用于修改或访问类属性。

python 复制代码
class School:
    school_name = "Python大学"

    @classmethod
    def change_name(cls, new_name):
        cls.school_name = new_name

School.change_name("AI学院")
print(School.school_name)

输出:

复制代码
AI学院

4. 静态方法

静态方法使用 @staticmethod 定义,与类相关但不依赖于类或实例的属性。 适合写通用工具方法。

python 复制代码
class MathTool:
    @staticmethod
    def add(a, b):
        return a + b

print(MathTool.add(5, 7))  # 12

四、属性的访问控制

Python 没有像 Java 那样严格的访问修饰符(public/private),但提供了命名约定来实现"伪私有化"。

1. 公有属性

  • 命名:name
  • 外部可直接访问

2. 受保护属性

  • 命名:_name
  • 按约定仅类及子类中使用(但外部仍可访问)

3. 私有属性

  • 命名:__name
  • 外部无法直接访问(会被"名称改写")
python 复制代码
class Person:
    def __init__(self, name, age):
        self.name = name          # 公有属性
        self._nickname = "小名"    # 受保护属性
        self.__age = age          # 私有属性

p = Person("张三", 18)
print(p.name)         # 张三
# print(p.__age)      # 报错
print(p._Person__age)  # 可通过改写访问(不推荐)

五、属性的封装与访问方法

为了保护数据安全,我们可以使用 getter / setter 方法

python 复制代码
class BankAccount:
    def __init__(self, owner, balance):
        self.owner = owner
        self.__balance = balance  # 私有属性

    def get_balance(self):
        return self.__balance

    def deposit(self, amount):
        if amount > 0:
            self.__balance += amount
        else:
            print("存款金额必须大于0")

    def withdraw(self, amount):
        if amount <= self.__balance:
            self.__balance -= amount
        else:
            print("余额不足")

account = BankAccount("李雷", 1000)
account.deposit(500)
print(account.get_balance())  # 1500

六、使用 @property 装饰器实现更优雅的属性访问

@property 可以把方法"伪装成属性",让访问方式更自然。

python 复制代码
class Circle:
    def __init__(self, radius):
        self._radius = radius

    @property
    def area(self):
        return 3.14 * self._radius ** 2

c = Circle(5)
print(c.area)  # 78.5

无需调用方法,直接访问即可。 这是一种常见的 Pythonic 编程风格。


七、属性与方法的协作------对象的完整行为

综合示例:

python 复制代码
class Car:
    wheels = 4  # 类属性

    def __init__(self, brand, speed):
        self.brand = brand
        self.speed = speed

    def accelerate(self, value):
        self.speed += value
        print(f"{self.brand} 提速至 {self.speed} km/h")

    def brake(self):
        print(f"{self.brand} 减速,当前速度 {self.speed} km/h")

car = Car("Tesla", 80)
car.accelerate(20)
car.brake()

输出:

bash 复制代码
Tesla 提速至 100 km/h
Tesla 减速,当前速度 100 km/h

八、小结

分类 定义方式 特点
实例属性 self.属性名 每个对象独有
类属性 直接定义在类中 所有对象共享
实例方法 def func(self) 操作对象数据
类方法 @classmethod def func(cls) 操作类数据
静态方法 @staticmethod def func() 通用逻辑函数
封装 ___ 前缀 保护数据安全

九、结语

在 Python 的面向对象编程中,属性是数据,方法是行为。 掌握属性与方法的定义、访问和封装,就掌握了类的灵魂。

属性描述对象,方法定义行为。 它们让类不再是"模板",而成为"有生命的对象"。


相关推荐
程序员爱钓鱼7 小时前
Python编程实战——面向对象与进阶语法 | 构造函数与析构函数
后端·python·ipython
逻极7 小时前
Rust之结构体(Structs):构建自定义数据类型
开发语言·后端·rust
四念处茫茫8 小时前
Rust:复合类型(元组、数组)
开发语言·后端·rust
南汐汐月8 小时前
重生归来,我要成功 Python 高手--day31 线性回归
python·机器学习·线性回归
华仔啊8 小时前
为什么你的 @Transactional 不生效?一文搞懂 Spring 事务机制
java·后端
逻极8 小时前
Rust 结构体方法(Methods):为数据附加行为
开发语言·后端·rust
国服第二切图仔8 小时前
Rust入门开发之Rust 集合:灵活的数据容器
开发语言·后端·rust
今日说"法"8 小时前
Rust 线程安全性的基石:Send 与 Sync 特性解析
开发语言·后端·rust
IT_陈寒9 小时前
从2秒到200ms:我是如何用JavaScript优化页面加载速度的🚀
前端·人工智能·后端