前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >python中的静态方法和类方法

python中的静态方法和类方法

作者头像
全栈程序员站长
发布于 2022-07-09 04:22:49
发布于 2022-07-09 04:22:49
1.5K00
代码可运行
举报
运行总次数:0
代码可运行

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

静态方法:

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

例子:

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、做一个颜色的动态匹配

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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、假设我有一个学生类和一个班级类,想要实现的功能为:

班级类含有类方法:

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 中,如果方法只通过类调用,而不需要通过实例调用的话,不用非要声明为静态的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/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即可:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/usr/bin/python3
class test:
  def show():
    print ("show")

test.show()

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021年11月,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python面向对象
对象查找属性的顺序:先从对象空间找 ------> 类空间找 ------> 父类空间找 ------->…
Dreamy.TZK
2020/04/09
5250
类方法,静态方法和实例方法
2.类名的规范是: 1 数字字母下划线组成 2 不能以数字开头 3 首字母大写,驼峰命名 (例如:TestResult)
清菡
2020/12/02
2.8K0
类方法,静态方法和实例方法
【Python基础编程】多态、静态方法与类对象的核心概念
上篇文章主要介绍了python面向对象继承、重写和super等,接下来继续了解多态,静态方法以及类相关的知识点。
易辰君
2024/11/07
990
实例方法,类方法和静态方法的区别_python中类的所有实例方法
第一个参数是”self”,表示实例对象,通过它传递实例的属性和方法。只能由实例调用
全栈程序员站长
2022/09/20
2K0
python-静态方法staticmethod、类方法classmethod、属性方法property
Python的方法主要有3个,即静态方法(staticmethod),类方法(classmethod)和实例方法:
狼啸风云
2019/12/19
2.2K0
python必学的面向对象基础之继承静态与多态
在现实生活中,继承一般指的是子继承父辈的财产。在面向对象中继承也是同样道理,不过子继承了父的所有类
神的孩子都在歌唱
2025/03/12
520
python必学的面向对象基础之继承静态与多态
python类方法和静态方法
使用装饰器@classmethod来定义类方法。原理上来说,类方法是将类本身作为对象进行操作的方法。类方法内部可以直接访问类属性、类方法、实例方法,但是无法访问实例属性。例如:
zy010101
2022/05/05
5720
Python之类方法,lambda,闭包
类方法,通过装饰器@classmethod来标明,可以通过实例对象或类对象直接调用的方法。
py3study
2020/01/17
6140
python--类方法、对象方法、静态方法
python中实现静态方法和类方法都是依赖于python的修饰器来实现的。 对象方法有self参数,类方法有cls参数,静态方法是不需要这些附加参数的。 1、我们已经讨论了类/对象可以拥有像函数一样的方法,这些对象方法与函数的区别只是一个额外的self变量 # -*- coding:utf-8 -*- #!/usr/bin/python # Filename: method.py class Person: grade=1 def __init_
学到老
2018/03/19
2.2K0
【从零学习python 】45.Python中的类方法和静态方法
类方法是以类对象作为第一个参数的方法。需要使用装饰器@classmethod来标识其为类方法。对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。
全栈若城
2024/02/29
1410
Python面向对象编程-类和对象-静态方法和类方法
静态方法是属于类的方法,但是它不需要访问类或实例的任何属性或方法。静态方法使用@staticmethod装饰器定义,它们可以通过类或类的实例来调用,但是它们不会接受类或实例作为第一个参数。静态方法可以用来实现与类相关的功能,但是这些功能不需要访问类或实例的状态。
玖叁叁
2023/04/19
5100
Python - 面向对象(二)类方法、静态方法
答案:实例方法,因为可以通过 类对象.类属性 来访问,但在类方法中无法访问实例属性
小菠萝测试笔记
2020/06/09
5680
Python的类和方法——成员可见性
使用装饰器@classmethod。第一参数必须是当前类对象,该参数名一般约定为「cls」,当然cls也可以换成其他名字,通过它来传递类的属性和方法(不能传实例的属性和方法)
stormwen
2019/08/05
9720
python类:类方法和静态方法
http://blog.csdn.net/pipisorry/article/details/49516185
用户7886150
2020/12/01
8900
python笔记60 - 类里面静态方法(@staticmethod),类方法(@classmethod)和实例方法(self)
python 类里面常用的方法有3个:静态方法(@staticmethod),类方法(@classmethod)和实例方法(self) 本篇讲解这3种方法在使用上有什么区别。
上海-悠悠
2021/08/20
8.9K0
Python实例方法、类方法和类方法静态方法浅析
Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。所以在调用类方法时,无需显式为 cls 参数传参。
Go进阶者
2021/04/29
2.5K0
Python实例方法、类方法和类方法静态方法浅析
Python 小知识点(6)--静态方法、类方法、属性方法
存在的问题是变成属性了直接赋值是无法实现的,需要在重新相同的方法,同时将该方法加上@eat.setter进行装饰。
wfaceboss
2019/04/08
4430
每日一道python面试题 - Python的实例,类和静态方法揭秘
注意:对于Python 2用户:@staticmethod和@classmethod装饰器自Python 2.4起可用,此示例将按原样工作。class MyClass:您可以选择声明一个继承自object该class MyClass(object):语法的新样式类,而不是使用简单的声明。除此之外,您还不错。
公众号---人生代码
2020/05/16
1.1K0
Python - 面向对象编程 - 实例方法、静态方法、类方法
实例方法 在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法 实例方法栗子 class PoloBlog: def __init__(self, name, age): print("自动调用构造方法") self.name = name self.age = age def test(self): print("一个实例方法,需要通过对象调用") print("my name is :",
小菠萝测试笔记
2022/03/23
6320
Python - 面向对象编程 - 实例方法、静态方法、类方法
详解 Python 方法之类方法 & 静态方法
这几天的阅读量蜜汁低,是什么原因我也没搞清楚,如果你们觉得我哪里写的有问题,或者是哪里不好,欢迎后台或者微信告知我,先行谢过。
编程文青李狗蛋
2019/11/07
1.7K0
推荐阅读
相关推荐
Python面向对象
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文