Python 面向对象基础

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) # 2

# 调用方法
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() # 我是Alice,25岁,来自Unknown

p2 = Person("Bob", 30, "Beijing")
p2.introduce() # 我是Bob,30岁,来自Beijing

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()) # 2

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) # Alice
print(account._balance) # 1000(可访问,但不建议)
# print(account.__password) # AttributeError
print(account._BankAccount__password) # 123(名称修饰)

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) # 25
print(temp.fahrenheit) # 77.0

temp.celsius = 30
print(temp.fahrenheit) # 86.0

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)) # Alice, 25岁
print(repr(p)) # Person('Alice', 25)

14.10 本章小结

  • 类是对象的模板,对象是类的实例
  • __init__ 是构造方法,self 代表实例
  • 实例属性属于对象,类属性属于类
  • 实例方法、类方法(@classmethod)、静态方法(@staticmethod
  • 使用 ___ 约定访问控制
  • @property 用于属性管理
  • __str____repr__ 定义字符串表示

练习题

  1. 创建 Rectangle 类,包含长和宽,计算面积和周长
  2. 创建 BankAccount 类,实现存款、取款、查询余额功能
  3. Student 类添加 __str__ 方法
  4. 以下代码输出什么?
    1
    2
    3
    4
    5
    6
    class Test:
    x = 10
    def __init__(self):
    self.x = 20
    t = Test()
    print(t.x)
ByteFisher
分享编程技术 · 记录钓鱼乐趣
扫码关注
▸ 扫码关注 ◂
Python基础教程 系列
第 14/20 篇
分享: