006. Python中类方法、类实例方法、静态方法有何区别?

全部放一个里面篇幅过大了,就拆分成1个个发布

示例代码

class Human:
def __init__(self, name):
self.name = name def say(self):
print(f'我的名字是{self.name}') @classmethod
def walk(self):
print('类方法 walk') @staticmethod
def sleep():
print('类静态方法 sleep')

一般这样调用

# 类名.类方法
Human.walk() # 实例名.实例方法
wuxianfeng = Human('wuxianfeng')
wuxianfeng.say() # 静态方法则无所谓
Human.sleep()
wuxianfeng.sleep()

问题就是,实例能否调用类方法?类能否调用实例方法呢?

  • 实例能否调用类方法:能,比如wuxianfeng.walk()

  • 类能否调用实例方法:不能,比如Human.say()

    TypeError: say() missing 1 required positional argument: 'self'

小结

方法 装饰器 参数 调用方
类方法 @classmethod cls 类,实例(不推荐)
实例方法 self 实例
静态方法 @staticmethod 无默认参数 类(推荐),实例(不推荐)

cls代指类本身,self代指实例

class Person:
@classmethod
def eat(cls): # 这里的cls就是指Person
pass
def drink(self): # 这里的self就是指Person()出来的实例
pass

cls和self这2个名字只是约定,见名知义,不建议更改,IDE会给你提示,其他地方需要自己注意,事实上你可以写成任意的名字,但不推荐

class Person:
@classmethod
def eat(class_name):
print('eat')
def drink(instance_name):
print('drink')
Person.eat() # 没毛病
Person().drink() # 没毛病

pycharm中的提示信息

官网

@classmethod

把一个方法封装成类方法。

一个类方法把类自己作为第一个实参,就像一个实例方法把实例自己作为第一个实参。请用以下习惯来声明类方法:

class C:
@classmethod
def f(cls, arg1, arg2): ...

@classmethod 这样的形式称为函数的 decorator

类方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。 其所属类以外的类实例会被忽略。 如果类方法在其所属类的派生类上调用,则该派生类对象会被作为隐含的第一个参数被传入。

类方法与 C++ 或 Java 中的静态方法不同。 如果你需要后者,请参阅本节中的 staticmethod()

@staticmethod

将方法转换为静态方法。

静态方法不会接收隐式的第一个参数。要声明一个静态方法,请使用此语法

class C:
@staticmethod
def f(arg1, arg2, ...): ...

@staticmethod 这样的形式称为函数的 decorator

静态方法的调用可以在类上进行 (例如 C.f()) 也可以在实例上进行 (例如 C().f())。

Python中的静态方法与Java或C ++中的静态方法类似。另请参阅 classmethod() ,用于创建备用类构造函数的变体。

像所有装饰器一样,也可以像常规函数一样调用 staticmethod ,并对其结果执行某些操作。比如某些情况下需要从类主体引用函数并且您希望避免自动转换为实例方法。对于这些情况,请使用此语法:

class C:
builtin_open = staticmethod(open)

Python常见面试题006 类方法、类实例方法、静态方法有何区别?的更多相关文章

  1. 整理的最全 python常见面试题(基本必考)

    整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...

  2. 整理的最全 python常见面试题

      整理的最全 python常见面试题(基本必考)① ②③④⑤⑥⑦⑧⑨⑩ 1.大数据的文件读取: ① 利用生成器generator: ②迭代器进行迭代遍历:for line in file; 2.迭代 ...

  3. Python常见面试题

    Q 1:Python 有哪些特点和优点? 作为一门编程入门语言,Python 主要有以下特点和优点: ● 可解释● 具有动态特性● 面向对象● 简明简单● 开源● 具有强大的社区支持当然,实际上 Py ...

  4. python常见面试题(二)

    1. 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行之前不需 ...

  5. python常见面试题(三)

    问题1 到底什么是Python?你可以在回答中与其他技术进行对比(也鼓励这样做). 答案 下面是一些关键点: Python是一种解释型语言.这就是说,与C语言和C的衍生语言不同,Python代码在运行 ...

  6. 315道Python常见面试题

    第一部分,Python基础篇 为什么学习Python? 通过什么途径学习的Python? Python和Java.PHP.C.C#.C++等其他语言的对比? 简述解释型和编译型编程语言? Python ...

  7. python常见面试题(mark)

    1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in file 2.迭代器和生成器的区别 1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方 ...

  8. 【python常见面试题】之python 中对list去重的多种方法

    在python相关职位的面试过程中,会对列表list的去重进行考察.(注意有时会要求保证去重的顺序性) 1.直观方法 li=[1,2,3,4,5,1,2,3] new_li=[] for i in l ...

  9. python常见面试题(一)

    1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一.对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都 ...

  10. 10道Python常见面试题

    1.MySQL索引种类 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 2.索引在什么情况下遵循最左前缀的规则? 最左前缀原理的一部分,索引index1:(a,b,c),只会走a ...

随机推荐

  1. 【Linux】通过Crontab和shell脚本实现定期备份和删除PG数据库表数据

    〇.参考资料 一.Crontab使用 1.查看状态 service crond status 2.新建crontab任务 crontab -e 输入字符串 * * * * * cd /home/big ...

  2. Spring04:JdbcTemplate及事务控制(AOP、XML、注解)

    今日内容 Spring中的JdbcTemplate 作业:Spring基于AOP的事务控制 Spring中的事务控制 基于XML的 基于注解的 一.JdbcTemplate 1.JdbcTemplat ...

  3. 【每日一题】【DFS】2022年1月5日-543. 二叉树的直径

    给定一棵二叉树,你需要计算它的直径长度.一棵二叉树的直径长度是任意两个结点路径长度中的最大值.这条路径可能穿过也可能不穿过根结点. 答案: /** * Definition for a binary ...

  4. MongoDB数据库与Python的交互

    一.缘由 这是之前学习的时候写下的基础代码,包含着MongDB数据库和Python交互的基本操作. 二.代码实现 import pymongo #连接数据库 client=pymongo.MongoC ...

  5. 【Markdown编辑器】语法规则

    一.Markdown介绍及工具推荐 1.介绍 Markdown是一种轻量级标记语言,它以纯文本形式(易读.易写.易更改)编写文档,并最终以HTML格式发布.Markdown也可以理解为将以MARKDO ...

  6. [R语言] R语言PCA分析教程 Principal Component Methods in R

    R语言PCA分析教程 Principal Component Methods in R(代码下载) 主成分分析Principal Component Methods(PCA)允许我们总结和可视化包含由 ...

  7. APIO2022 游记

    Day 0 有人刚登记完房间就把房卡落在房间里了我不说是谁(真不是我,不信去问jth) 下午把gen把模拟赛的题补了一下,T3是个不太可做的虚树上淀粉质dp,先咕着. Day 1 上午来的比较晚,没有 ...

  8. ClickHouse ORM 3.x 发布啦

    经过1年断断续续的迭代,ClickHouse ORM 3.x 发布啦-说说它的故事吧. 回顾下2022 说来惭愧上次写博客都是22年4月份了,今年行情不好团队急剧收缩,工作几乎全扑在接手存量业务和主业 ...

  9. 静态static关机子修饰成员方法-静态static的内存图

    静态static关机子修饰成员方法 静态方法 当 static 修饰成员方法时,该方法称为类方法 .静态方法在声明中有 static ,建议使用类名来调用,而不需要 创建类的对象.调用方式非常简单. ...

  10. 前端基础知识-css(一)个人学习记录

    待补充 flex及其属性 https://blog.csdn.net/weixin_44706267/article/details/121291934 css3新特性 sass和less https ...