属性与方法
在 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
总结
- 属性:实例属性表示对象的状态,类属性是共享的状态。
- 方法:定义对象行为,包括普通方法、类方法、静态方法和特殊方法。
- 私有性:通过双下划线实现对属性和方法的封装。
掌握属性和方法后,能更好地构建清晰、简洁且强大的类!