属性与方法

在 Python 的面向对象编程中,属性方法是类和对象的两大核心部分。

  • 属性:描述对象的状态或特征(数据)。
  • 方法:定义对象的行为或功能(操作)。

我们通过类将属性和方法组织起来,让代码更清晰、可维护。


1. 属性

属性分为实例属性类属性

(1) 实例属性

  • 定义:通过 self.属性名 定义,属于具体的对象。
  • 特点:每个对象的实例属性互不影响。

示例:

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

# 创建两个对象
p1 = Person("小明", 18)
p2 = Person("小红", 20)

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

(2) 类属性

  • 定义:在类内部,self 之外定义的变量。
  • 特点:类属性属于整个类,由所有对象共享。

示例:

class Car:
    wheels = 4  # 类属性

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

car1 = Car("Toyota")
car2 = Car("BMW")

# 访问类属性
print(car1.wheels)  # 输出:4
print(car2.wheels)  # 输出:4

# 修改类属性
Car.wheels = 6
print(car1.wheels)  # 输出:6

2. 方法

方法是类中的函数,用于定义对象的行为。

(1) 普通方法

  • 定义:必须包含参数 self,用于表示调用方法的实例对象。
  • 调用:通过 对象名.方法名()

示例:

class Dog:
    def __init__(self, name):
        self.name = name

    def bark(self):  # 定义普通方法
        print(f"{self.name} 正在汪汪叫!")

dog = Dog("旺财")
dog.bark()  # 输出:旺财 正在汪汪叫!

(2) 类方法

  • 定义:使用 @classmethod 装饰器,参数为 cls,表示类本身。
  • 作用:操作类属性或提供与类相关的功能。

示例:

class Animal:
    species = "动物"

    @classmethod
    def show_species(cls):
        print(f"这是一个 {cls.species}")

Animal.show_species()  # 输出:这是一个 动物

(3) 静态方法

  • 定义:使用 @staticmethod 装饰器,不依赖类或实例。
  • 作用:实现逻辑独立的功能。

示例:

class Math:
    @staticmethod
    def add(a, b):
        return a + b

print(Math.add(3, 5))  # 输出:8

(4) 特殊方法

特殊方法以双下划线开头和结尾,用于实现类的某些特殊功能。

  • __init__:构造方法,用于初始化对象。
  • __str__:定义对象的字符串表示。
  • __len__:用于 len() 函数。

示例:

class Book:
    def __init__(self, title, pages):
        self.title = title
        self.pages = pages

    def __str__(self):
        return f"《{self.title}》,共 {self.pages} 页"

book = Book("Python 从入门到进阶", 500)
print(book)  # 输出: 《Python 从入门到进阶》,共 500 页

3. 属性与方法的结合

属性与方法通常一起使用,属性表示对象的状态,方法对这些状态进行操作。

示例:

class BankAccount:
    def __init__(self, account_holder, balance=0):
        self.account_holder = account_holder  # 实例属性
        self.balance = balance  # 实例属性

    def deposit(self, amount):
        self.balance += amount  # 更新余额
        print(f"{self.account_holder} 存入了 {amount} 元,当前余额:{self.balance} 元")

    def withdraw(self, amount):
        if amount > self.balance:
            print("余额不足,无法取款")
        else:
            self.balance -= amount
            print(f"{self.account_holder} 取出了 {amount} 元,当前余额:{self.balance} 元")

# 创建账户并操作
account = BankAccount("小明", 100)
account.deposit(50)  # 输出:小明 存入了 50 元,当前余额:150 元
account.withdraw(70)  # 输出:小明 取出了 70 元,当前余额:80 元

4. 私有属性与方法

(1) 私有属性

  • 通过在属性名前加双下划线 __ 声明。
  • 私有属性只能在类内部访问。

示例:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 私有属性

    def show_age(self):
        print(f"{self.name} 的年龄是 {self.__age}")

p = Person("小明", 18)
p.show_age()  # 输出:小明 的年龄是 18
# print(p.__age)  # 报错:AttributeError

(2) 私有方法

  • 定义:方法名以双下划线开头。
  • 调用:只能通过类内部其他方法调用。

示例:

class Secret:
    def __secret_method(self):
        print("这是一个私有方法")

    def access_secret(self):
        self.__secret_method()

s = Secret()
s.access_secret()  # 输出:这是一个私有方法

5. 属性与方法的综合使用

通过结合属性和方法,可以模拟现实中复杂的行为逻辑,使代码更加面向对象。

示例:

class Student:
    def __init__(self, name, scores):
        self.name = name
        self.scores = scores

    def average_score(self):
        return sum(self.scores) / len(self.scores)

    def show_info(self):
        print(f"学生:{self.name},平均成绩:{self.average_score():.2f}")

s = Student("小红", [85, 90, 78, 92])
s.show_info()  # 输出:学生:小红,平均成绩:86.25

总结

  1. 属性:实例属性表示对象的状态,类属性是共享的状态。
  2. 方法:定义对象行为,包括普通方法、类方法、静态方法和特殊方法。
  3. 私有性:通过双下划线实现对属性和方法的封装。

掌握属性和方法后,能更好地构建清晰、简洁且强大的类!