微信关注,获取更多

跟着AI学Python 第9课:面向对象编程基础 — 类与对象

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课:面向对象编程基础 — 类与对象

评论

5+3=

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏