import os
DIR = os.path.dirname(os.path.abspath(__file__))
# 第9课:面向对象编程 —— 类与对象
# 1.认识类和对象
# 类(class)是设计图,对象(object)是按设计图造出来的东西
class Dog:
"""一个简单的狗类""" # 类的说明文档
def __init__(self, name, age):
"""初始化方法:创建对象时自动调用"""
self.name = name # self.name 是对象的属性
self.age = age
def bark(self):
"""方法:狗叫"""
print(f"{self.name}:汪汪汪!")
def info(self):
"""方法:显示信息"""
print(f"我叫{self.name},今年{self.age}岁")
# 创建对象(实例化)
dog1 = Dog("旺财", 3)
dog2 = Dog("小白", 1)
dog1.info()
dog1.bark()
dog2.info()
dog2.bark()
print()
# 2.self 是什么?—— 指向对象自己
class Person:
def __init__(self, name, phone):
self.name = name # self.name = 对象自己的name属性
self.phone = phone
def say_hello(self):
# self让每个对象知道"是我自己在说话"
print(f"你好,我是{self.name},电话是{self.phone}")
p1 = Person("火鸟", "13518667656")
p2 = Person("小明", "13800138000")
p1.say_hello()
p2.say_hello()
print()
# 3.修改和访问属性
class Score:
def __init__(self, name, score):
self.name = name
self.score = score
def show(self):
print(f"{self.name}的成绩:{self.score}分")
def add_bonus(self, bonus):
self.score += bonus
print(f"{self.name}加了{bonus}分,现在是{self.score}分")
s = Score("火鸟", 85)
s.show()
s.add_bonus(10) # 加分
s.score = 100 # 直接修改属性
s.show()
print()
# 4.继承:子类继承父类的能力
class Animal:
"""父类:动物"""
def __init__(self, name):
self.name = name
def eat(self):
print(f"{self.name}在吃东西")
def sleep(self):
print(f"{self.name}在睡觉")
class Cat(Animal): # Cat继承Animal
"""子类:猫"""
def catch_mouse(self): # 猫特有的方法
print(f"{self.name}在抓老鼠")
class Bird(Animal): # Bird继承Animal
"""子类:鸟"""
def fly(self): # 鸟特有的方法
print(f"{self.name}在飞")
kitty = Cat("小花")
kitty.eat() # 继承来的方法
kitty.catch_mouse() # 自己的方法
parrot = Bird(" Polly")
parrot.sleep() # 继承来的方法
parrot.fly() # 自己的方法
print()
# 5.方法重写:子类改写父类的行为
class Animal2:
def __init__(self, name):
self.name = name
def speak(self):
print(f"{self.name}发出声音")
class Dog2(Animal2):
def speak(self): # 重写父类方法
print(f"{self.name}:汪汪汪!")
class Cat2(Animal2):
def speak(self): # 重写父类方法
print(f"{self.name}:喵喵喵!")
animals = [Dog2("旺财"), Cat2("小花"), Dog2("大黄")]
for a in animals:
a.speak() # 同一个方法名,不同对象表现不同 → 这叫"多态"
print()
# 6.实战:用类改造通讯录
class Contact:
"""联系人类"""
def __init__(self, name, phone):
self.name = name
self.phone = phone
def __str__(self): # __str__定义打印对象时的显示内容
return f"{self.name} - {self.phone}"
class AddressBook:
"""通讯录类"""
def __init__(self):
self.contacts = []
self.filepath = os.path.join(DIR, "contacts3.txt")
def load(self):
"""加载通讯录"""
try:
with open(self.filepath, "r", encoding="utf-8") as f:
for line in f:
parts = line.strip().split(",")
if len(parts) == 2:
self.contacts.append(Contact(parts[0], parts[1]))
print(f"已加载 {len(self.contacts)} 条联系人")
except FileNotFoundError:
print("通讯录为空,从零开始")
def save(self):
"""保存通讯录"""
try:
with open(self.filepath, "w", encoding="utf-8") as f:
for c in self.contacts:
f.write(f"{c.name},{c.phone}\n")
print("保存成功!")
except Exception as e:
print(f"保存失败:{e}")
def add(self, name, phone):
"""添加联系人"""
if not name or not phone:
raise ValueError("姓名和电话不能为空")
if not phone.isdigit():
raise ValueError("电话必须是纯数字")
self.contacts.append(Contact(name, phone))
self.save()
print(f"已添加:{name} - {phone}")
def search(self, keyword):
"""搜索联系人"""
results = [c for c in self.contacts if keyword in c.name or keyword in c.phone]
if results:
print(f"搜索"{keyword}"结果:")
for c in results:
print(f" {c}")
else:
print(f"未找到"{keyword}"")
def show_all(self):
"""显示所有联系人"""
if not self.contacts:
print("通讯录为空")
return
print("--- 通讯录 ---")
for i, c in enumerate(self.contacts, 1):
print(f"{i}. {c}")
# 测试
book = AddressBook()
book.load()
try:
book.add("火鸟", "13518667656")
book.add("小明", "13800138000")
except ValueError as e:
print(f"添加失败:{e}")
book.search("火鸟")
book.show_all()
知识点速查
| 知识点 | 关键代码 | 作用 |
|---|---|---|
| 定义类 | class Dog: |
创建设计图 |
| 初始化 | def __init__(self, ...) |
创建对象时自动执行 |
| self | self.name = name |
指向对象自己 |
| 继承 | class Cat(Animal): |
子类获得父类的能力 |
| 方法重写 | 子类中同名方法 | 子类改写父类行为 |
| 多态 | 同方法名,不同表现 | 统一接口,灵活实现 |
| str | def __str__(self) |
定义打印对象时的显示 |
未经允许不得转载:百花谷博客 » 跟着AI学Python 第9课:面向对象编程基础 — 类与对象

百花谷博客
微信关注,获取更多