python企业级框架设计要点-staticmethod能继承不,论 python 的多态细节

Java-Study 基础环境搭建。 阅读详情

这个问题非常经典,核心是:

在 Python 中,父类的方法是否能调用子类的实现?


✅ 简短回答:

是的,在面向对象编程中,如果子类重写了父类的方法,并且父类通过 self.方法名() 的方式调用该方法,那么实际调用的是子类的实现。

这是 多态(Polymorphism) 的体现。


🧠 一、Python 多态机制简述

Python 是动态类型语言,支持运行时多态。这意味着:

  • 调用方法时,解释器会根据对象的实际类型来决定调用哪个方法。
  • 如果子类重写了父类的方法,实例调用时将使用子类的方法。

🔁 二、示例说明

示例 1:父类调用子类实现 ✅

class Parent:
    def greet(self):
        print("Hello from Parent")
        self.say_something()

    def say_something(self):
        print("Parent is speaking")

class Child(Parent):
    def say_something(self):
        print("Child is speaking")

c = Child()
c.greet()

输出结果:

Hello from Parent
Child is speaking

✅ 说明:

  • greet() 是父类定义的方法。
  • 它内部调用了 self.say_something()。
  • 因为 Child 重写了 say_something(),所以最终调用的是子类的实现。

❓ 三、如果是静态方法或类方法呢?

示例 2:父类调用子类的类方法 ❌

class Parent:
    @classmethod
    def greet(cls):
        print("Hello from Parent")
        cls.say_something()

    @classmethod
    def say_something(cls):
        print("Parent says something")

class Child(Parent):
    @classmethod
    def say_something(cls):
        print("Child says something")

Child.greet()

输出结果:

Hello from Parent
Child says something

✅ 结论:

  • 类方法也支持多态。
  • cls.say_something() 实际上会调用子类的 say_something()。

示例 3:静态方法不支持多态 ⚠️

class Parent:
    @staticmethod
    def greet():
        print("Hello from Parent")
        Parent.say_something()

    @staticmethod
    def say_something():
        print("Parent says something")

class Child(Parent):
    @staticmethod
    def say_something():
        print("Child says something")

Child.greet()

输出结果:

Hello from Parent
Parent says something

❌ 结论:

  • 静态方法中,直接调用 Parent.say_something() 不会自动绑定到子类。
  • 所以不会调用子类的实现。
  • 想要多态行为,应该使用 @classmethod 或实例方法。

🧪 四、更高级的玩法:抽象基类 + 接口设计

你可以使用 abc.ABCMeta 和 @abstractmethod 来强制子类实现某些方法:

from abc import ABC, abstractmethod

class Animal(ABC):
    def speak(self):
        print("Animal speaks")
        self.make_sound()

    @abstractmethod
    def make_sound(self):
        pass

class Dog(Animal):
    def make_sound(self):
        print("Woof!")

d = Dog()
d.speak()

输出结果:

Animal speaks
Woof!

✅ 这种方式可以确保子类必须实现某个方法,同时支持父类调用子类逻辑。


📌 总结对比表

方法类型父类能否调用子类实现?是否推荐用于多态?
实例方法✅ 是✅ 推荐
类方法✅ 是✅ 推荐
静态方法❌ 否❌ 不推荐
抽象方法✅ 是✅ 强烈推荐

💡 最佳实践建议

  • 尽量避免在父类中硬编码调用 Parent.method(),应使用 self.method() 或 cls.method()。
  • 使用 抽象基类(Abstract Base Class) 来规范接口。
  • 对于工具类/无状态类,使用模块级函数可能更清晰简洁。

@classmethod 和 @staticmethod 是 Python 中两个常用的装饰器,它们都可以在不创建类实例的前提下调用类中的方法,看起来用法相似,但本质区别很大。


🧠 一、核心区别一句话总结:

  • @classmethod 第一个参数是类本身(约定为 cls),可以访问和修改类属性。
  • @staticmethod 没有自动传入的参数,它就是一个普通的函数,只是放在类里面。

📊 二、详细对比表

特性@classmethod@staticmethod
是否接收类作为第一个参数✅ 是 (cls)❌ 否
是否能访问或修改类属性/方法✅ 可以❌ 不可以
是否依赖类名❌ 不依赖(通过 cls)✅ 依赖(硬编码类名)
是否支持继承多态✅ 支持❌ 不支持
是否可被子类重写并影响父类行为✅ 是❌ 否
适用场景工厂方法、类方法封装、需要访问类结构的方法工具函数、逻辑与类有关但无需访问类内容

🔁 三、代码示例说明

示例 1:@classmethod

class Animal:
    count = 0

    def __init__(self):
        Animal.count += 1

    @classmethod
    def get_count(cls):
        return cls.count

class Dog(Animal):
    pass

d1 = Dog()
d2 = Dog()

print(Dog.get_count())   # 输出: 2 ✅ 继承了 Animal 的 classmethod,并且 cls 是 Dog

✅ 说明:

  • get_count() 是 @classmethod
  • cls 自动指向调用它的类(这里是 Dog)
  • 所以 cls.count 实际访问的是 Dog.count,而不是 Animal.count

示例 2:@staticmethod

class Animal:
    count = 0

    def __init__(self):
        Animal.count += 1

    @staticmethod
    def get_count():
        return Animal.count

class Dog(Animal):
    count = 0

d1 = Dog()
d2 = Dog()

print(Dog.get_count())  # 输出: 0 ❌ 仍然是 Animal.count

❌ 说明:

  • get_count() 是 @staticmethod
  • 它固定访问的是 Animal.count,而不是 Dog.count
  • 所以即使子类有自己的 count,静态方法也不会使用它

🛠️ 四、实际应用建议

✅ 使用 @classmethod 的场景:

  • 类的工厂方法(factory method)
class User:
    def __init__(self, name):
        self.name = name

    @classmethod
    def from_json(cls, json_data):
        return cls(json_data['name'])
  • 单例模式、注册子类等元编程场景
class Plugin:
    registry = {}

    @classmethod
    def register(cls, name):
        def decorator(subclass):
            cls.registry[name] = subclass
            return subclass
        return decorator

✅ 使用 @staticmethod 的场景:

  • 与类有关的工具函数,但不需要访问类本身
class MathUtils:
    @staticmethod
    def add(a, b):
        return a + b
  • 辅助函数,逻辑上属于类,但不依赖类状态
class FileUtils:
    @staticmethod
    def is_valid_filename(name):
        return isinstance(name, str) and len(name) > 0

🧪 五、进阶玩法:组合使用

你可以在一个类中同时使用两者,发挥各自优势:

class Product:
    instances = []

    def __init__(self, name):
        self.name = name
        Product.instances.append(self)

    @classmethod
    def get_all(cls):
        return cls.instances

    @staticmethod
    def validate_name(name):
        return isinstance(name, str) and len(name) > 0
  • get_all() 是类方法,返回所有实例
  • validate_name() 是静态方法,仅做验证用途

📌 六、总结口诀

  • 要访问类属性或子类信息?👉 用 @classmethod
  • 只是一个辅助函数,和类无关?👉 用 @staticmethod
  • 需要多态?👉 用 @classmethod
  • 要解耦类名?👉 用 @classmethod
  • 简单工具函数?👉 用 @staticmethod

💡 最佳实践建议

场景推荐方式
工厂方法、类构造逻辑✅ @classmethod
多态调用、子类扩展✅ @classmethod
工具函数、辅助逻辑✅ @staticmethod
静态配置、常量定义✅ @staticmethod 或模块级函数

3天干完6个月的活,Claude把模型搬上AMD 一条挺刺激的消息:Anthropic 给投资人的材料里有一张幻灯片,写着它的 Claude Mythos Preview 只花了大约​,就摸清了怎么让另一个 Claude 模型在 AMD 的 MI355X 上跑起来。同一处还写了个对照数字:过去给一块新芯片做推理适配,通常要几十名工程师、​。3 天对 6 个月,这个比值太扎眼,当天中文互联网上就冒出一堆「英伟达的护城河塌了」的说法。我把能翻到的材料都翻了一遍,越看越觉得,塌掉的那一小块是真的,可塌的位置和很多人想的不一样。 阅读详情

相关推荐

如何处理动态语言(Python / JS)的“隐形”调用链?

本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。

xianyinsuifeng的博客 420

Java基础语法与核心编程要点详解

Java作为面向对象的强类型编程语言,其基础语法是构建复杂系统的基石。从变量定义、数据类型到流程控制,Java的语法设计既保证了类型安全,又通过IDE工具提升了开发效率。在工程实践中,合理选择数据类型(如int与long的取舍)、避免运算符陷阱、优化流程控制结构,都是提升代码质量的关键。特别是在企业级开发中,这些基础语法要素直接影响着系统的稳定性和性能表现。本文深入解析Java基础语法的核心要点,包括变量与数据类型实战、运算符的常见陷阱以及流程控制的最佳实践,帮助开发者夯实Java编程基础。

weixin_34396103的博客 328

顶刊《会计研究》数据复现|最新上市公司数智化数据

本文基于Python文本分析方法构建了中国A股上市公司数智化指标(1991-2024),通过识别年报中的"机器学习""智能医疗"等关键词,量化企业数字化与智能化融合程度。研究发现数智化企业更倾向于非正式渠道的定性披露以规避风险,该指标为监管完善信披规则提供了参考。研究还揭示了数智化对企业信息披露策略的转变,并提出了未来研究方向,包括数智化对绿色创新、ESG表现等影响机制。数据覆盖非金融类上市公司,采用文本挖掘技术构建结构化指标,为相关领域研究提供了微观基础。

PPdata_Academy的博客 1487

Java基础面试高频考点:集合框架、JVM内存模型、多线程与锁(附常见场景题)

本文全面介绍了Java编程语言的核心概念、特性及应用场景。主要内容包括: Java基础特性:平台无关性(JVM机制)、面向对象特性(封装、继承、多态)、内存管理(垃圾回收)。 数据类型与转换:8种基本数据类型及其包装类,类型转换方式(自动/强制转换),BigDecimal的精度优势。 面向对象设计:抽象类与接口区别,多态实现方式,设计原则(SOLID),内部类分类及特点。 关键特性详解: 反射机制原理及应用(动态加载、框架实现) 注解原理及运行时处理 异常处理体系(Checked/Unchecked异常)

xwhxy的博客 1021

transformer优化(一)-UNeXt 学习笔记

​它在早期阶段使用卷积,在潜在空间阶段使用 MLP。通过一个标记化的 MLP 块来标记和投影卷积特征,并使用 MLP 对表示进行建模。 ​

PLANTTHESON的博客 2035

NXP S32K5 MCU如何赋能Zonal架构与软件定义汽车?

汽车电子架构正从分布式ECU向域集中、再向Zonal分区架构演进,核心驱动力在于线束简化、算力下沉与软件分层解耦。区域控制器作为物理区域的“调度员”,需要同时满足实时响应、功能安全、多网络协议转换和OTA升级等要求,这使MCU与SoC的选型成为系统工程的关键决策。MCU凭借确定性的微秒级启动、低功耗、丰富的IO控制以及成熟的ASIL-D认证路径,仍是区域控制器的主流选择。NXP S32K5正是面向这一场景发布的系列MCU:它集成多核锁步、CAN-XL、TSN以太网、硬件安全模块与双Bank Flash,补齐

weixin_28721917的博客 359

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

本地化部署 DeepSeek,构建单细胞与空间转录组 AI 分析平台

weixin_53637133的博客 179

On the convergence of FedAvg on non-iid data

On the convergence of FedAvg on non-iid data

Lyn_S的博客 7082

【第 009 讲】全面掌握 Python 注释:注释的定义与作用 | 单行注释 | 三引号与多行注释 | 注释使用的最佳实践

本文系统讲解 Python 注释的完整知识体系:从注释的定义与作用讲起,梳理单行注释的书写位置、临时屏蔽用法与 PEP 8 排版规范,剖析注释被忽略的底层机制;进而说明三引号字符串的本质与嵌套问题;最后给出注释使用的三条实践原则,帮助读者写好可读性高的注释。

大模型全栈工程师 · Thanks_ks 316

【WRF-DART第一期】WRF/DART概述

【WRF-DART第一期】WRF/DART概述

WW、forever的博客 107

数字逻辑Fundamentals of Digital Logic with Verilog Design | 3rd Edition Solutins Chapter 6(step by step)

第六章6-1~6-42习题详解,缺少6-39和6-40

weixin_62651190的博客 1468

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 426

[QMT和ptrade量化交易小白入门]-122、基于聚类分析的动态股票池构建与ETF轮动策略,回测年化 132.09%

本专栏主要是介绍QMT和ptrade的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写200篇左右。QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。

木头大左的博客 1029

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 242

buildozer

/home/chenyang/new_kivy/.buildozer/android/platform/build/build/other_builds/hostpython3/desktop/hostpython3/Lib

东方佑 16万+

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【每天一个 Python 小案例30】Python 基础知识综合小项目:我的工具盒

作为系列收官,本篇把前 29 篇的知识点合成一个能直接用的命令行工具"我的工具盒":计算器(用 ast 解析表达式,不碰 eval)、单位换算与温度转换(一张换算表 + 特例分支)、记账与分类统计(Decimal + JSON 持久化)、以及用"字典当命令表"把菜单和业务逻辑解耦的主循环。文中对比了 eval 的安全隐患与 ast 白名单的做法,解释了 lambda 闭包在字典里的写法与晚绑定陷阱,并在最后给出整个系列的知识地图,把变量、数据结构、控制流、函数、类、异常、文件、标准库八块内容对应到具体篇目。

xinjiyaya的博客 427

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

yolo 和 deft 算法的区别

你应该是打错了:是,不是 defrat;

曾大强博客 257

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

两张表合并之后,行数悄悄多了一倍

pandas merge 行数异常膨胀源于右表键不唯一,导致数据静默复制。实测显示,未聚合的右表(756行)与左表合并后行数增至504行,合计膨胀3.5倍,但无报错。validate 参数仅在检查键唯一性时有效,one_to_one 和 many_to_one 可拦截问题,但需结合 duplicated() 前置检查。正确做法为先按键聚合右表,再合并,避免重复。建议合并前后核对行数、合计,并使用 indicator=True 排查匹配情况,确保数据一致性。

patrickstar231的博客 229

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 173

智慧农业实战:育秧车间秧盘计数与苗情分级的Python实现

首先,建立统一的数据结构,保存每盘秧苗的编号、批次、覆盖度、叶色得分和播种天数。A = "壮苗"B = "合格苗"C = "弱苗"@dataclassdays: int。

荆棘鸟智能的博客 131

我用 200 行代码写了个“代码屎山检测器“,扫完公司的老项目后我沉默了

这个工具不能帮你把屎山铲平,但至少能让你知道自己面对的是多大的山,也能在代码评审时用数据说话——“这个 PR 把圈复杂度从 12 推到了 18,能不能拆一下?毕竟,不能量化的东西,就没法改进。

xixiaoyunya的博客 252

Java Arrays.asList 常见坑详解|UnsupportedOperationException、数组联动、基本类型 bug

解析 Arrays.asList 常见开发陷阱,演示 UnsupportedOperationException、底层数组引用共享、基本类型数组问题,区分 Arrays 内部 ArrayList 与 java.util.ArrayList,给出数组转 List 的各种场景正确代码。

weixin_42617033的博客 499

【每天一个 Python 小案例29】Python 实现商品购物车

本篇实现一个购物车:商品目录、加入商品、修改数量、移除商品、查看小计、计算满减与 VIP 折扣、结算扣库存。核心设计是"目录与购物车分离"——目录存商品主数据,购物车只存 {商品编号: 数量};金额一律用 Decimal 并做 ROUND_HALF_UP 舍入。折扣部分讲清阶梯满减的匹配顺序(阈值从高到低、命中即停)与叠加顺序(先满减、后打折),并用一次完整结算演示 706 元如何变成 613.70 元。

xinjiyaya的博客 218

Spring Boot 自动配置原理

Spring Boot 自动配置由 @EnableAutoConfiguration 导入选择器,读取 jar 中 .imports 候选清单,经去重、排序、排除后逐类做条件判断,通过才注册 Bean。延迟导入让用户 Bean 优先,@ConditionalOnMissingBean 使默认配置让位。失效时查清单和 Negative matches。

2401_89855466的博客 394

【随笔】KV缓存量化:省下的显存,要付出多少数值误差

用可运行量化器解释位宽、比例信息、分组和离群值的关系,核算KV缓存实际载荷,并给出Transformers配置与容量、延迟、质量验收方法。

code2cat的博客 471

Python的字典

Python字典是存储键值对的数据结构,通过键(key)快速查找对应的值(value)。可使用{}定义,支持增删改查操作:通过dict[key]查询或修改值,get()方法安全获取并设置默认值,del dict[key]删除键值对,keys()、values()和items()用于遍历。items()结合双变量循环可高效遍历所有键值对,提升代码可读性与灵活性。

qq_43010954的博客 199
上一篇: python魔改窗口-builtins模块,实现企业级框架的跳板
下一篇: 专有软件许可证
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值