首页 > 编程语言 >Python常见面试题006 类方法、类实例方法、静态方法有何区别?

Python常见面试题006 类方法、类实例方法、静态方法有何区别?

时间:2023-02-25 07:11:20浏览次数:59  
标签:面试题 静态方法 Python self 实例 staticmethod 方法 def

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,self,实例,staticmethod,方法,def
From: https://www.cnblogs.com/wuxianfeng023/p/17150672.html

相关文章

  • Python调用chatgpt api
    前提:要有chatgpt账号,不会注册的关注抖音:21402780125,有免费教程!! 要在Python中调用ChatGPTAPI,您可以使用以下步骤:首先,安装Python的HTTP客户端库,例如requests......
  • 【1】部署环境python+pycharm+JDK+SDK+node安装+appium安装+Appium-python-client安装
                                               安装SDK检查命令 adbdoctor......
  • Java多线程面试题:描述一下线程安全活跃态问题,竞态条件?
    一、线程安全活跃态问题线程因为某件事情得不到执行1、活锁线程没有阻塞,但一直重复执行某个操作,并且失败重试1)例子在消息队列中,消费者没有正确a......
  • 我的Python程序太慢了。如何加快速度?
    如果你的Python程序太慢,你可以按照下面给出的提示和技巧-抽象化避免过度抽象,尤其是在微小函数或方法的形式下。抽象往往会产生间接性,并迫使解释器工作更多。如果间接寻......
  • Python 异步: 等待有时间限制的协程(12)
    我们可以使用asyncio.wait_for()函数等待asyncio任务或协程超时完成。如果在任务完成之前超时已过,任务将被取消。1.什么是Asynciowait_for()asyncio.wait_for()......
  • Python 之 WSGI、uWSGI 和 uwsgi 介绍
    目录一、概述二、安装uwsgi模块1)配置pip源2)安装uwsgi模块三、示例演示(uWSGI+Nginx配置)1)安装nginx2)创建app.py文件3)创建uWSGI配置文件4)启动uWSGI5)配置Web服......
  • PythonGame-1 pygame
    为了引导小孩学习编程,选择他喜欢的我的世界素材1、安装python,目前最新版本python311.exehttps://www.python.org/https://www.python.org/ftp/python/3.11.2/python-3.1......
  • python 协程
    协程Python中的协程和生成器很相似但又稍有不同。主要区别在于: 生成器是数据的生产者 协程则是数据的消费者首先我们先来回顾下生成器的创建过程。我们可以这样去创建......
  • python -m 和python -u
    python-m现有路径/home/ymliu/data/csyngec/supar/cmds/crf_con.py我们在目录csyngec下,运行python-msupar.cmds.crf_con与运行pythonsupar/cmds/crf_con.py一样......
  • python open函数
    open函数open 函数可以打开一个文件。超级简单吧?大多数时候,我们看到它这样被使用:f=open('photo.jpg','r+')jpgdata=f.read()f.close()我现在写这篇文章的原因,......