python语法-继承、方法命名、单例等

文章目录

定义一个类
python 复制代码
class Person:
    # 构造函数(初始化方法)
    def __init__(self, name, age):
        self.name = name  # 实例属性
        self.age = age

    # 实例方法
    def greet(self):
        return f"你好,我是{self.name},今年{self.age}岁。"

    # 类方法(使用 @classmethod 装饰器)
    @classmethod
    def from_birth_year(cls, name, birth_year):
        current_year = 2026  # 可以根据需要动态获取当前年份
        age = current_year - birth_year
        return cls(name, age)

    # 静态方法(使用 @staticmethod 装饰器)
    @staticmethod
    def is_adult(age):
        return age >= 18

# 使用示例
p1 = Person("张三", 25)
print(p1.greet())  # 输出:你好,我是张三,今年25岁。

p2 = Person.from_birth_year("李四", 2000)
print(p2.greet())  # 输出:你好,我是李四,今年26岁。

print(Person.is_adult(20))  # 输出:True
继承示例

要点:
1、语法 class SubClass(ParentClass):

class Dog(Animal): 表示 Dog 类继承自 Animal 类。Dog 自动拥有了 Animal 中定义的 init (如果不重写)、info 等方法。

2、super().init(...)

在子类的 init 中,我们通常需要先调用父类的初始化方法,以确保父类定义的属性(如 name, age)被正确设置。

super() 是一个内置函数,返回父类的临时对象。使用它比直接写 Animal.init(self, ...) 更灵活,特别是在多重继承时。

3、方法重写 (Overriding)

父类 Animal 有 speak() 方法,但返回的是通用声音。

子类 Dog 和 Cat 重新定义了 speak() 方法。当调用 my_dog.speak() 时,Python 会优先执行子类中定义的版本,而不是父类的。这就是多态的基础。

4、扩展功能

子类可以拥有父类没有的新属性(如 breed, color)和新方法(如 fetch, climb_tree)。

代码:

py 复制代码
# 1. 定义父类 (基类)
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def speak(self):
        return "Some generic animal sound..."

    def info(self):
        return f"我是 {self.name},今年 {self.age} 岁。"


# 2. 定义子类 (派生类) - 继承自 Animal
class Dog(Animal):
    def __init__(self, name, age, breed):
        # 调用父类的构造函数,初始化 name 和 age
        # super() 代表父类 (Animal)
        super().__init__(name, age)
        self.breed = breed  # 这是 Dog 特有的属性

    # 方法重写 (Override): 修改父类的方法行为
    def speak(self):
        return "汪汪汪!"

    # 新增方法: 子类特有的功能
    def fetch(self):
        return f"{self.name} 正在捡球..."


# 3. 定义另一个子类
class Cat(Animal):
    def __init__(self, name, age, color):
        super().__init__(name, age)
        self.color = color

    # 方法重写
    def speak(self):
        return "喵喵喵~"

    def climb_tree(self):
        return f"{self.name} 正在爬树..."


# --- 使用示例 ---

# 创建一个狗对象
my_dog = Dog("旺财", 3, "金毛")
print(my_dog.info())  # 输出: 我是 旺财,今年 3 岁。 (继承自 Animal)
print(my_dog.speak())  # 输出: 汪汪汪! (重写了 Animal 的 speak)
print(my_dog.fetch())  # 输出: 旺财 正在捡球... (Dog 特有的方法)
print(f"品种: {my_dog.breed}")

print("-" * 30)

# 创建一个猫对象
my_cat = Cat("咪咪", 2, "白色")
print(my_cat.info())  # 输出: 我是 咪咪,今年 2 岁。 (继承自 Animal)
print(my_cat.speak())  # 输出: 喵喵喵~ (重写了 Animal 的 speak)
print(my_cat.climb_tree())  # 输出: 咪咪 正在爬树... (Cat 特有的方法)

# 验证类型
print(isinstance(my_dog, Dog))  # True
print(isinstance(my_dog, Animal))  # True (狗也是动物)
相关推荐
曲幽9 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码10 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱19 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵21 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio1 天前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户0332126663671 天前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
兵慌码乱2 天前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2