面向对象基础
什么是面向对象编程
面向对象编程(OOP)是一种编程范式,它将数据和操作数据的方法组织成对象。这种编程方式更符合人类的思维方式,便于代码的组织和复用。
# 定义一个简单的类
class Dog:
def bark(self):
print("汪汪!")
# 创建对象
my_dog = Dog()
my_dog.bark() # 输出: 汪汪!
类的定义
类是对象的蓝图,它定义了对象的属性和方法。
class Person:
# 类属性(所有实例共享)
species = "人类"
def __init__(self, name, age):
# 实例属性(每个实例独有)
self.name = name
self.age = age
def introduce(self):
return f"我叫{self.name},今年{self.age}岁"
# 创建实例
person1 = Person("张三", 25)
person2 = Person("李四", 30)
print(person1.introduce()) # 输出: 我叫张三,今年25岁
print(person2.introduce()) # 输出: 我叫李四,今年30岁
__init__方法
__init__是构造方法,在创建对象时自动调用,用于初始化对象的属性。
class BankAccount:
def __init__(self, owner, balance=0):
self.owner = owner
self.balance = balance
self.created_at = datetime.now()
def deposit(self, amount):
if amount > 0:
self.balance += amount
return True
return False
def withdraw(self, amount):
if 0 < amount <= self.balance:
self.balance -= amount
return True
return False
# 使用示例
account = BankAccount("张三", 1000)
account.deposit(500)
print(f"余额: {account.balance}") # 输出: 余额: 1500
self参数
self代表类的实例本身,通过它可以访问实例的属性和方法。
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
def perimeter(self):
return 2 * (self.width + self.height)
def is_square(self):
return self.width == self.height
# 使用示例
rect = Rectangle(5, 3)
print(f"面积: {rect.area()}") # 输出: 面积: 15
print(f"周长: {rect.perimeter()}") # 输出: 周长: 16
print(f"是否为正方形: {rect.is_square()}") # 输出: 是否为正方形: False
实例属性与类属性
类属性属于类本身,所有实例共享;实例属性属于特定实例,每个实例独立拥有。
class Employee:
# 类属性
company = "Python公司"
employee_count = 0
def __init__(self, name, salary):
# 实例属性
self.name = name
self.salary = salary
Employee.employee_count += 1
# 创建实例
emp1 = Employee("张三", 50000)
emp2 = Employee("李四", 60000)
# 访问类属性
print(Employee.company) # 输出: Python公司
print(Employee.employee_count) # 输出: 2
# 访问实例属性
print(emp1.name) # 输出: 张三
print(emp2.name) # 输出: 李四
方法的类型
Python类可以定义不同类型的方法。
class Circle:
def __init__(self, radius):
self.radius = radius
# 实例方法
def area(self):
return 3.14159 * self.radius ** 2
# 类方法
@classmethod
def from_diameter(cls, diameter):
return cls(diameter / 2)
# 静态方法
@staticmethod
def is_valid_radius(value):
return isinstance(value, (int, float)) and value > 0
# 使用示例
circle1 = Circle(5)
circle2 = Circle.from_diameter(10)
print(circle1.area()) # 输出: 78.53975
print(Circle.is_valid_radius(5)) # 输出: True
最佳实践
- 使用有意义的类名和方法名,遵循PEP 8命名规范
- 将相关的属性和方法组织在同一个类中
- 使用
__init__方法初始化对象状态 - 保持类的职责单一,避免创建过于复杂的类
- 使用类属性存储所有实例共享的数据
- 为类添加文档字符串,说明其用途和用法
面向对象编程是Python的核心特性之一,掌握它能让你写出更清晰、更易维护的代码。