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


相关推荐

  • stringtokenizer java,Java中的StringTokenizer「建议收藏」

    stringtokenizer java,Java中的StringTokenizer「建议收藏」Java中的StringTokenizerjava.util.StringTokenizer类允许您将字符串分成令牌。这是打破字符串的简单方法。它没有提供区分数字,带引号的字符串,标识符等的功能,例如StreamTokenizer类。我们将在I/O一章中讨论StreamTokenizer类。StringTokenizer类的构造方法StringTokenizer类中定义了3个构造函数。Constr…

    2022年8月11日
    5
  • Android 开机动画源码分析

    Android 开机动画源码分析Android系统在启动SystemServer进程时,通过两个阶段来启动系统所有服务,在第一阶段启动本地服务,如SurfaceFlinger,SensorService等,在第二阶段则启动一系列的Java服务。开机动画是在什么时候启动的呢?通过查看源码,Android开机动画是在启动SurfaceFlinger服务时启动的。SystemServer的main函数首先调用init1来启动本地服务,

    2022年5月15日
    37
  • 微信聊天记录数据分析「建议收藏」

    目录一、项目背景二、数据准备三、数据预处理及描述性统计四、数据分析1.聊天时间分布图2.高频词汇统计3.词云图展示五、其它探索性分析一、项目背景2021年2月20日我和我女朋友第一次见面,之后开启了我们两个人的故事,时隔一年我想将我们的聊天记录提取出来进行简单的数据分析一下。微信里面有2021年4月20日至2022年2月20日的聊天记录,一共十个月的数据。二、数据准备在网上有许多文章关于可以找到关于…

    2022年4月12日
    454
  • python实现将数据写入Excel文件中「建议收藏」

    python实现将数据写入Excel文件中「建议收藏」将数据写入Excel文件中,用python实现起来非常的简单,下面一步步地教大家。一、导入excel表格文件处理函数importxlwt注意,这里的xlwt是python的第三方模块,需要下载安装才能使用,不然导入不了(python第三方库的安装也非常简单,打开命令行,输入pipinstallxlwt就可以了)二、创建excel表格类型文件book=xlwt.Workbook(encoding=’utf-8′,style_compression=0)调用xlwt模块中的Workbo

    2022年6月28日
    71
  • 基于STM32的RFID-RC522门禁系统

    设计介绍这是一个基于STM32的RFID-RC522门禁系统,LCD1602显示当前状态,当检测到IC卡时,如果这个IC卡已经登记过,LCD1602上会显示IC卡的卡号,继电器打开,如果没有登记则报警。部分代码如下,需要源码的朋友可以在文章下方链接下载。#include”sys.h”#include”delay.h”#include”lcd.h”#include”led.h”#…

    2022年4月14日
    46
  • 关于PHP的内置服务器的使用

    关于PHP的内置服务器的使用

    2021年10月17日
    43

发表回复

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

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