14.1 面向对象概念
面向对象编程(OOP)是一种编程范式,将数据和操作封装在对象中。
核心概念
- 类(Class):对象的蓝图/模板
- 对象(Object):类的实例
- 属性(Attribute):对象的数据
- 方法(Method):对象的行为
为什么使用 OOP
- 封装:隐藏内部实现
- 复用:代码可重复使用
- 扩展:易于添加新功能
- 维护:模块化便于管理
14.2 定义类
基本语法
1 2 3 4 5 6
| class 类名: def __init__(self, 参数): self.属性 = 参数 def 方法(self): pass
|
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Dog: def __init__(self, name, age): self.name = name self.age = age def bark(self): print(f"{self.name} 汪汪叫!")
dog1 = Dog("旺财", 3) dog2 = Dog("小白", 2)
print(dog1.name) print(dog2.age)
dog1.bark() dog2.bark()
|
14.3 init 方法
__init__ 是构造方法,创建对象时自动调用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Person: def __init__(self, name, age, city="Unknown"): self.name = name self.age = age self.city = city def introduce(self): print(f"我是{self.name},{self.age}岁,来自{self.city}")
p1 = Person("Alice", 25) p1.introduce()
p2 = Person("Bob", 30, "Beijing") p2.introduce()
|
14.4 self 参数
self 代表实例本身,必须作为方法的第一个参数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Counter: def __init__(self): self.count = 0 def increment(self): self.count += 1 def get_count(self): return self.count
c = Counter() c.increment() c.increment() print(c.get_count())
|
14.5 实例属性与类属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Student: school = "希望中学" def __init__(self, name, grade): self.name = name self.grade = grade
s1 = Student("Alice", "A") s2 = Student("Bob", "B")
print(s1.school) print(s2.school)
Student.school = "光明中学" print(s1.school) print(s2.school)
|
14.6 实例方法、类方法、静态方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class MyClass: class_var = "类变量" def __init__(self, value): self.instance_var = value def instance_method(self): print(f"实例方法: {self.instance_var}") @classmethod def class_method(cls): print(f"类方法: {cls.class_var}") @staticmethod def static_method(): print("静态方法:不访问实例或类")
obj = MyClass(100) obj.instance_method() MyClass.class_method() MyClass.static_method()
|
14.7 属性访问控制
Python 没有真正的私有属性,使用命名约定。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class BankAccount: def __init__(self, owner, balance): self.owner = owner self._balance = balance self.__password = "123" def deposit(self, amount): if amount > 0: self._balance += amount def get_balance(self): return self._balance
account = BankAccount("Alice", 1000) print(account.owner) print(account._balance)
print(account._BankAccount__password)
|
14.8 property 装饰器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class Temperature: def __init__(self, celsius): self._celsius = celsius @property def celsius(self): return self._celsius @celsius.setter def celsius(self, value): if value < -273.15: raise ValueError("温度不能低于绝对零度") self._celsius = value @property def fahrenheit(self): return self._celsius * 9/5 + 32
temp = Temperature(25) print(temp.celsius) print(temp.fahrenheit)
temp.celsius = 30 print(temp.fahrenheit)
|
14.9 字符串表示
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| class Person: def __init__(self, name, age): self.name = name self.age = age def __str__(self): return f"{self.name}, {self.age}岁" def __repr__(self): return f"Person('{self.name}', {self.age})"
p = Person("Alice", 25) print(str(p)) print(repr(p))
|
14.10 本章小结
- 类是对象的模板,对象是类的实例
__init__ 是构造方法,self 代表实例
- 实例属性属于对象,类属性属于类
- 实例方法、类方法(
@classmethod)、静态方法(@staticmethod)
- 使用
_ 和 __ 约定访问控制
@property 用于属性管理
__str__ 和 __repr__ 定义字符串表示
练习题
- 创建
Rectangle 类,包含长和宽,计算面积和周长
- 创建
BankAccount 类,实现存款、取款、查询余额功能
- 为
Student 类添加 __str__ 方法
- 以下代码输出什么?
1 2 3 4 5 6
| class Test: x = 10 def __init__(self): self.x = 20 t = Test() print(t.x)
|