python中的静态方法和类方法

python中的静态方法和类方法

静态方法和类方法在python2.2中被引用,经典类和新式类都可以使用。同时,一对内建函数:staticmethod和classmethod被引入,用来转化类中某一方法为这两种方法之一。

静态方法:

静态方法是类中的函数,不需要实例。静态方法主要是用来存放逻辑性的代码,主要是一些逻辑属于类,但是和类本身没有交互,即在静态方法中,不会涉及到类中的方法和属性的操作。可以理解为将静态方法存在此类的名称空间中。事实上,在python引入静态方法之前,通常是在全局名称空间中创建函数。

例子:

譬如,我想定义一个关于时间操作的类,其中有一个获得当前时间的函数。

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

  如上,使用静态函数,既可以将获得时间的函数功能与实例解绑,我想获得当前时间的字符串时,并不一定需要实例化对象,此时更像是一种名称空间。

我们可以在类外面写一个简单的方法来做这些,但是这样做就扩散了类代码的关系到类定义的外面,这样写就会导致以后代码维护的困难。

静态函数可以通过类名以及实例两种方法调用!

类方法:

类方法是将类本身作为对象进行操作的方法。他和静态方法的区别在于:不管这个方式是从实例调用还是从类调用,它都用第一个参数把类传递过来

https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner/12179325#12179325

@classmethod means: when this method is called, we pass the class as the first argument instead of the instance of that class (as we normally do with methods). This means you can use the class and its properties inside that method rather than a particular instance.

@staticmethod means: when this method is called, we don’t pass an instance of the class to it (as we normally do with methods). This means you can put a function inside a class but you can’t access the instance of that class (this is useful when your method does not use the instance).

应用:

1、做一个颜色的动态匹配

class ColorTest(object):
    color = "color"
    @classmethod
    def value(self):
        return self.color
    
class Red(ColorTest):
    color = "red"
    
class Green(ColorTest):
    color = "green"

g = Green()
print g.value()
print Green.value()

  其中,基类做一个抽象共性,对于实际的颜色的值需要结合实际的类进行匹配。

2、假设我有一个学生类和一个班级类,想要实现的功能为:

班级类含有类方法:

执行班级人数增加的操作、获得班级的总人数

学生类继承自班级类,每实例化一个学生,班级人数都能增加。

最后,我想定义一些学生,然后获得班级中的总人数。

 

思考:这个问题用类方法做比较合适,因为我实例化的时学生,但是如果我从学生这一个实例中获得班级总人数是不合理的。

同时,如果想要获得班级总人数,如果生成一个班级的实例也是没有必要的。

class ClassTest(object):
    __num = 0
    @classmethod
    def addNum(self):
        self.__num += 1
    @classmethod
    def getNum(self):
        return self.__num
    
    def __new__(self):
        ClassTest.addNum()
        return super(ClassTest,self).__new__(self)
    
class Student(ClassTest):
    def __init__(self):
        self.name = ''
          

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

  这里我用到魔术函数__new__,主要是为了在创建实例的时候调用人数累加的函数。

类函数可以通过类名以及实例两种方法调用!

注意:

python2 中,必须总要把一个方法声明为静态的,从而能够不带一个实例而调用它。

python3 中,如果方法只通过类调用,而不需要通过实例调用的话,不用非要声明为静态的。

#!/usr/bin/python
class test:
  def show():
    print ("show")

test.show()

  此时会出现错误:

[root@localhost home]# ./test.py
Traceback (most recent call last):
File “./test.py”, line 6, in <module>
test.show()
TypeError: unbound method show() must be called with test instance as first argument (got nothing instead)

 

改到python3即可:

#!/usr/bin/python3
class test:
  def show():
    print ("show")

test.show()

  

 

 

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

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

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


相关推荐

  • springboot afterproperties(管理方法)

    在看用redis实现异步消息队列时,遇到了注册Event,其中看到了afterPropertiesSet。然后查博客,记录下。一、简单介绍1、init-method方法,初始化bean的时候执行,可以针对某个具体的bean进行配置。init-method需要在applicationContext.xml配置文档中bean的定义里头写明。例如:这样,当TestBean在初

    2022年4月18日
    51
  • source insight注册码S4_source insight3.5注册码

    source insight注册码S4_source insight3.5注册码sourceInsight vesion3.50.0058注册码SI3US-361500-17409

    2022年9月1日
    2
  • Python与数据库之学员管理系统「建议收藏」

    Python与数据库之学员管理系统「建议收藏」学院管理系统:一、系统需求二、准备程序⽂件1.分析2.创建程序⽂件三、书写程序1.main.py2.student.py3.managerSystem.py四.总结一、系统需求使⽤⾯向对象编程思想完成学员管理系统的开发,具体如下:系统要求:学员数据存储在MySQL数据库中系统功能:添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退出系统等功能。保存学院信息功能可以实现将学员信息每秒自动保存至数据库中。二、准备程序⽂件1.分析为了⽅便维护代码,⼀般⼀个⻆⾊

    2022年9月2日
    6
  • 要想成功先脱去幼稚

    要想成功先脱去幼稚记者问:“人要活得明白通透需要时间吗?”郭德纲答:“不需要时间,需要经历。一个人六十了,从小没挨过打,没人说过什么难听话。走大街上,别人瞪了一眼,咔,死了;一个人从小每天挨十个嘴巴,天天挨骂,长大了铁罗汉,抗压能力高。”经历过大风大浪真的可以帮助我们变得成熟稳重,那么问题来了,我们每天经历不了那么多的风浪,怎么办?这个时候,我认为应该先提高自己的思想。人不成熟的五大特征:人不成熟的第一…

    2022年6月2日
    33
  • 汇编指令之移位指令[通俗易懂]

    汇编指令之移位指令[通俗易懂]   移位指令包括了算术移位指令、逻辑移位指令、循环移位指令。    格式为:xxxoper1,CL/1       ;移位次数只能是1或者存放在CL里面。一、算术移位指令1、算术左移指令SAL功能:左移一次,最低位补0,最高位送入CF标志位,如图:意义:左移n次,等于x2的n次幂。所以可用于有符号操作数做x2的n次幂运算。2、算术右移指令SAR功能:右移一次,最高位保持不变,最低位送入…

    2022年4月28日
    60
  • iOS 自我检測

    iOS 自我检測

    2022年1月29日
    49

发表回复

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

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