实例方法,类方法和静态方法的区别_python中类的所有实例方法

实例方法,类方法和静态方法的区别_python中类的所有实例方法实例方法第一个参数是"self",表示实例对象,通过它传递实例的属性和方法。只能由实例调用类方法使用装饰器@classmethod,第一个参数可以是"cls&quo

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

实例方法

第一个参数是”self”,表示实例对象,通过它传递实例的属性和方法。只能由实例调用

类方法

使用装饰器@classmethod,第一个参数可以是”cls”,也可以是”self”,通过它传递类的属性和方法。可以由类和实例调用

假设我有一个学生类和一个班级类,想要实现的功能为:班级类含有类方法:执行班级人数增加的操作、获得班级的总人数,学生类继承自班级类,每实例化一个学生,班级人数都能增加。最后,我想定义一些学生,然后获得班级中的总人数
这个问题用类方法做比较合适,因为我实例化的时学生,但是如果我从学生这一个实例中获得班级总人数是不合理的,同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的

class ClassTest(object):

    __num = 0

    @classmethod
    def addNum(cls):
        cls.__num += 1

    @classmethod
    def getNum(cls):
        return cls.__num

    def __new__(self):
        ClassTest.addNum()
        return object.__new__(self)


class Student(ClassTest):
    def __init__(self):
        self.name = ""

a = Student()
b = Student()
print(ClassTest.getNum())

静态方法

使用装饰器 @staticmethod,不需要实例。静态方法主要用来存放逻辑性的代码,逻辑上属于类,但是和类本身没有交互,也就是说在静态方法中,不会涉及到类中的属性和方法的操作。可以理解为,静态方法是独立的,单纯的函数,它仅仅托管于某个类的名称空间中,便于使用和维护。可以由类和实例调用
例如,定义一个关于时间操作的类,其中有一个获得当前时间的函数

import time

class TimeTest(object):

    def __init__(self, hour, minute, second):
        self.hour = hour
        self.minute = minute
        self.second = second

    @staticmethod
    def showTime():
        return time.strftime("%H:%M:%S", time.localtime())


print(TimeTest.showTime())
t = TimeTest(2, 10, 10)
nowTime = t.showTime()
print(nowTime)

使用静态函数,既可以将获得时间的函数功能与实例解绑,我想获得当前时间的字符串时,并不一定需要实例化对象,此时更像是一种名称空间。我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面,这样写就会导致以后代码维护的困难

参考文章

《python中的静态方法和类方法》
《python中类方法,实例方法,静态方法的作用和区别》

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/167580.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MyBatis-延迟加载与MyBatis缓存(面试题)

    MyBatis-延迟加载与MyBatis缓存(面试题)MyBatis-延迟加载与MyBatis缓存-概念性MyBatis-延迟加载与MyBatis缓存MyBatis-延迟加载与MyBatis缓存-概念性延迟加载(面试题)1、什么是延迟加载(按需加载)2、延迟加载MyBatis缓存(面试题)1、Cache缓存2、MyBatis缓存分析3、一级缓存4、二级缓存原理开启二级缓存5、禁用二级缓存6、刷新二级缓存延迟加载(面试题)1、什么是延迟加载(按需…

    2022年5月21日
    34
  • 神经网络的基本原理[通俗易懂]

    神经网络的基本原理[通俗易懂]1.神经网络1.1.神经元概述神经网络是由一个个的被称为“神经元”的基本单元构成,单个神经元的结构如下图所示:对于上述的神经元,其输入为x1x_1x1​,x2x_2x2​,x3x_3x3​以及截距+1+1+1,其输出为:hW,b(x)=f(WTx)=f(∑i=13Wixi+b)h_{\mathbf{W},b}\left(\mathbf{x}\right)=f\left(\mathbf{W}^T\mathbf{x}\right)=f\left(\sum_{i=1}^{3}W_

    2022年7月20日
    10
  • 关于秒的单位_时间分秒后面是什么单位

    关于秒的单位_时间分秒后面是什么单位github地址秒的各单位换算1秒(s)=1000毫秒(ms)=1,000,000微秒(μs)=1,000,000,000纳秒(ns)=1,000,000,000,000皮秒(ps)=1,000,000,000,000,000飞秒(fs)=1,000,000,000,000,000,000渺秒(as)皮秒(英语:picosecond)天文学名词;符…

    2025年9月22日
    5
  • js字符串截取为数组

    js字符串截取为数组varstr=”hello,word,java,eclipse,jsp”;//字符串截取为数组varstrArr=str.split(“,”);for(j=0,len=strArr.length;j<len;j++){alert(strArr[j]);};

    2022年5月1日
    56
  • PHP永久激活码2021(最新序列号破解)

    PHP永久激活码2021(最新序列号破解),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    322
  • Java Double转Bigdecimal丢失精度原因学习

    Java Double转Bigdecimal丢失精度原因学习记录学习Double转Bigdecimal丢失精度的原因注意事项:不能直接使用Bigdecimal的构造函数传double进行转换,部分数值会丢失精度,因为计算机是二进制的Double无法精确的储存一些小数位,0.1的double数据存储的值实际上并不真的等于0.1如该方式将0.1转换为Bigdecimal得到的结果是0.1000000000000000055511151231257827021181583404541015625这是为什么呢,以往只是知道结论知道不能这么用,也大概知道是因为do

    2022年6月4日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号