python -- @classmethod @staticmethod区别和使用

python中的定义:

  1. class MyClass:
  2. ...
  3. @classmethod  # classmethod的修饰符
  4. def class_method(cls, arg1, arg2, ...):
  5. ...
  6. @staticmethod  # staticmethod的修饰符
  7. def static_method(arg1, arg2, ...):
  8. ...

@classmethod : 类方法

@staticmethod : 静态方法

类方法和静态方法的调用一样,都是通过类就可以直接调用。

区别:类方法,需要传入该类,定义类方法的时候要传一个默认的参数cls。静态方法则不用。

示例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# blog.ithomer.net

class Test(object):

    x = 11

    def __init__(self, _x):

        self._x = _x

        print("Test.__init__")

 

    @classmethod

    def class_method(cls):

        print("class_method")

 

    @staticmethod

    def static_method():

        print("static_method")

 

    @classmethod

    def getPt(cls):

        cls.class_method()

        cls.static_method()

 

if "__main__" == __name__:

    Test.class_method()         # class_method

    Test.static_method()        # static_method

    Test.getPt()                # class_method  static_method

    t = Test(22)                # Test.__init__

    t.class_method()            # class_method

    t.static_method()           # static_method

    

    print Test.x                # 11

#     print Test._x

    

    print t.x                   # 11

    print t._x                  # 22

    

#     t.getPr()   # ‘Test‘ object has no attribute ‘getPr‘

运行结果:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

class_method

static_method

class_method

static_method

Test.__init__

class_method

static_method

11

11

22

Traceback (most recent call last):

  File "/home/homer/workspace/myPython/com/connmiliao.py", line 40, in <module>

    t.getPr()

AttributeError: ‘Test‘ object has no attribute ‘getPr‘</module>

示例:@property,@staticmethod,@classmethod 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# blog.ithomer.net

class MyClass(object):

    def __init__(self):

        print ‘__init__‘

        self._name = ‘blog.ithomer.net‘

    @staticmethod

    def static_method():

        print ‘This is a static method!‘

    def test(self):

        print ‘call test‘

    @classmethod

    def class_method(cls):

        print ‘cls: ‘,cls

        print ‘cls.name: ‘,cls.name

        print ‘cls.static_method(): ‘,cls.static_method()

        instance = cls()

        print ‘instance.test(): ‘,instance.test()

    @property

    def name(self):

        return self._name

    

    @name.setter

    def name(self, value):

        self._name = value

if __name__ == ‘__main__‘:

    MyClass.static_method()

    MyClass.class_method()

    

    mc = MyClass()

    print mc.name

    mc.name = ‘forum.ithomer.net‘

    print mc.name

运行结果:

This is a static method!
cls: <class ‘__main__.myclass‘="">
cls.name: 
cls.static_method(): This is a static method!
None
__init__
instance.test(): call test
None
__init__
blog.ithomer.net
forum.ithomer.net

时间: 2024-11-10 13:19:34

python -- @classmethod @staticmethod区别和使用的相关文章

Python @classmethod&amp;@staticmethod 区别

转自Stackoverflow@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 rath

【转】Python @classmethod @staticmethod

今天读代码的时候发现Python的class定义中提及了@classmethod修饰符,然后查阅了一些材料一探究竟,先做个总结吧. 在Python中提到 classmethod 就要提到 staticmethod,不是因为二者有什么关系,而是为了让用户区分以便更清楚地写代码.在C++中,我们了解直接通过类名访问的函数称为类的静态函数,即static修饰的函数,可见C++中classmethod和staticmethod是一个概念. 那么python中二者有什么区别呢?先来看下二者如何在pytho

python中@classmethod @staticmethod区别

Python中3种方式定义类方法, 常规方式, @classmethod修饰方式, @staticmethod修饰方式. class A(object): def foo(self, x): print("executing foo(%s,%s)" % (self, x)) print('self:', self) @classmethod def class_foo(cls, x): print("executing class_foo(%s,%s)" % (cl

python 装饰器语法糖(@classmethod @staticmethod @property @name.)原理剖析和运用场景

引用:http://blog.csdn.net/slvher/article/details/42497781 这篇文章系统的介绍这几者之间的关系和区别.有兴趣的朋友可以到上面的链接查看原文,这里我把原文拷贝如下(如有侵权,通知马上删除) ==================================================================== 在阅读一些开源Python库的源码时,经常会看到在某个类的成员函数前,有类似于@staticmethod或@classme

Python @staticmethod, @classmethod, @property

@staticmethod, @classmethod, @property 用法及作用 class Foo(object) : def __init__(self) : self._name = "property test" print "init" def test(self) : print "class method" @property def name(self) : return self._name @staticmethod

Python 2 和Python 3的区别

Python 2 和Python 3 的区别: 1. 直接运行python,其实是调用的python2,输入python3 ,其实是调用的是python3 2. 在python 2中需要提前标示出utf-8 的中文输入字符,# -*- coding: utf-8 -*-  或  #coding=utf-8 , 但是在python 3中可以直接输入,不用强调有中文: 3. 在python 2 和python 3中,在input 功能上有很大的区别,在python 中,input 是直接运算. py

python @classmethod 的使用场合

python @classmethod 的使用场合 官方的说法: classmethod(function)中文说明:classmethod是用来指定一个类的方法为类方法,没有此参数指定的类的方法为实例方法,使用方法如下: class C: @classmethod def f(cls, arg1, arg2, ...): ... 看后之后真是一头雾水.说的啥子东西呢??? 自己到国外的论坛看其他的例子和解释,顿时就很明朗. 下面自己用例子来说明. 看下面的定义的一个时间类: class Dat

PyCharm中Directory与Python package的区别

PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言(当然其功能并不仅限于此,在此只是讨论该特点),随着程序的增长,可能想要把它分成几个文件,以便逻辑更加清晰,更好维护,亦或想要在几个程序中均使用某个函数,而不必将其复制粘贴到所有程序中. 为了支持这一点,Python有一种方法将定义函数放在一个文件中,并在脚本中使用它们,这样的文件叫做模块,一个模块中的定义可以被导入到其他模块,或

0 python和perl区别

help(dit.keys) ---使用帮助,查看字典类型中keys函数的说明 关于print python --- 字符串后面可以不用加\n 自动换行 per --- 不会自动换行,需加上\n 关于执行SQL语句. python与perl相同 使用变量来接收时,它是个二维数组, 每一条查询结果,即为一个一维数组, 每个字段,即为一维数组中的元素 ## 注意: 如果python执行SQL返回一行数据,则它为一维数组,返回多行数据,则为二维数组 python与perl区别在于: python使用f