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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python之抛出异常(raise语句)「建议收藏」

    python之抛出异常(raise语句)「建议收藏」用raise能够主动抛出异常,使用【raise异常名】抛出该类异常raiseIndexError也可以单独使用raise再次引发刚发生的异常try:1/0except:print(“错误”)raise同时能够指定抛出异常的描述信息raiseIndexError(“索引错误”)所以这样子就用【raise异常名from异…

    2022年8月31日
    6
  • Linux内核有没有rootfs,Linux内核rootfs的初始化过程[通俗易懂]

    Linux内核有没有rootfs,Linux内核rootfs的初始化过程[通俗易懂]由于在下水平相当有限,不当之处,还望大家批评指正^_^在Linuxshell中执行mount命令,通常可以看到某个做了文件系统的磁盘分区或flash分区或内存文件系统做为所谓的根文件系统被mount到了挂载点/处。实际上内核中最初始的根文件系统,并不是来自内核外部,他是由内核自己构建出来的。为了说明这个过程,我们先说说mount的过程。系统调用sys_mount是在fs/namespace.c…

    2022年9月28日
    0
  • 如何在pycharm中安装selenium「建议收藏」

    如何在pycharm中安装selenium「建议收藏」发现问题:出现未解析引用解决问题:打开设置中的项目,可以看到没有安装selenium库点击+号搜索selenium并安装包

    2022年8月28日
    5
  • mybatis返回map结果集 key value_java map.entry

    mybatis返回map结果集 key value_java map.entry原文:http://blog.csdn.net/sou_liu/article/details/47755635最近需要用到Mybatis中查询结果集为Map的功能,查了好多资料,最终搞定。其实只需要重写ResultHandler接口,,然后用SqlSession的select方法,将xml里面的映射文件的返回值配置成HashMap就可以了。具体过程如下1、先看看

    2022年10月5日
    2
  • java代码生成器,springboot代码生成器,加入oracle支持

    java代码生成器,springboot代码生成器,加入oracle支持续接上一篇博客,今天生成器又加入了oracle的支持,界面做了些许的微调,先看一下效果吧比之前好看了一点点吧,然后我们进行oracle配置在这里随便选了公司局域网oracle数据库中的一张表,名字有点长,然后点击数据项配置在这里对交互进行了优化,因为首次连接数据库有时会花费几秒的时间,加了一些提示,如果出现错误,也会出现友好提示,在这里就不一…

    2022年5月29日
    30
  • 为什么 main 方法是 public static void ?

    为什么 main 方法是 public static void ?初级程序员面试经常会遇到这个问题,这篇博客带你排异解难。

    2022年5月6日
    36

发表回复

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

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