Python - 静态函数(staticmethod), 类函数(classmethod), 成员函数 区别(完全解析)

原文地址:http://blog.csdn.net/caroline_wendy/article/details/23383995

静态函数(staticmethod), 类函数(classmethod), 成员函数的区别(完全解析)

定义:

静态函数(@staticmethod): 即静态方法,主要处理与这个类的逻辑关联, 如验证数据;

类函数(@classmethod):即类方法, 更关注于从类中调用方法, 而不是在实例中调用方法, 如构造重载;

成员函数: 实例的方法, 只能通过实例进行调用;

代码:

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

#eclipse pydev, python 3.3
#by C.L.Wang  

class A(object):  

    _g = 1  

    def foo(self,x):
        print(‘executing foo(%s,%s)‘%(self,x))  

    @classmethod
    def class_foo(cls,x):
        print(‘executing class_foo(%s,%s)‘%(cls,x))  

    @staticmethod
    def static_foo(x):
        print(‘executing static_foo(%s)‘%x)     

a = A()
a.foo(1)
a.class_foo(1)
A.class_foo(1)
a.static_foo(1)
A.static_foo(‘hi‘)
print(a.foo)
print(a.class_foo)
print(a.static_foo)  

输出:

executing foo(<__main__.A object at 0x01E2E1B0>,1)
executing class_foo(<class ‘__main__.A‘>,1)
executing class_foo(<class ‘__main__.A‘>,1)
executing static_foo(1)
executing static_foo(hi)
<bound method A.foo of <__main__.A object at 0x01E2E1B0>>
<bound method type.class_foo of <class ‘__main__.A‘>>
<function A.static_foo at 0x01E7E618>  

具体应用:

比如日期的方法, 可以通过实例化(__init__)进行数据输出;

可以通过类方法(@classmethod)进行数据转换;

可以通过静态方法(@staticmethod)进行数据验证;

代码:

  1. # -*- coding: utf-8 -*-
  2. #eclipse pydev, python 3.3
  3. #by C.L.Wang
  4. class Date(object):
  5. day = 0
  6. month = 0
  7. year = 0
  8. def __init__(self, day=0, month=0, year=0):
  9. self.day = day
  10. self.month = month
  11. self.year = year
  12. def display(self):
  13. return "{0}*{1}*{2}".format(self.day, self.month, self.year)
  14. @classmethod
  15. def from_string(cls, date_as_string):
  16. day, month, year = map(int, date_as_string.split(‘-‘))
  17. date1 = cls(day, month, year)
  18. return date1
  19. @staticmethod
  20. def is_date_valid(date_as_string):
  21. day, month, year = map(int, date_as_string.split(‘-‘))
  22. return day <= 31 and month <= 12 and year <= 3999
  23. date1 = Date(‘12‘, ‘11‘, ‘2014‘)
  24. date2 = Date.from_string(‘11-13-2014‘)
  25. print(date1.display())
  26. print(date2.display())
  27. print(date2.is_date_valid(‘11-13-2014‘))
  28. print(Date.is_date_valid(‘11-13-2014‘))

输出:

12*11*2014
11*13*2014
False
False  

参考:

http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner

http://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python

时间: 2024-11-09 11:01:14

Python - 静态函数(staticmethod), 类函数(classmethod), 成员函数 区别(完全解析)的相关文章

Python中@staticmethod和@classmethod的作用和区别

相同之处:@staticmethod 和@classmethod 都可以直接类名.方法名()来调用,不用在示例化一个类. @classmethod 我们要写一个只在类中运行而不在实例中运行的方法.如果我们想让方法不在实例中运行,可以这么做: def iget_no_of_instance(ins_obj): return ins_obj.__class__.no_inst class Kls(object): no_inst = 0 def __init__(self): Kls.no_inst

python中 staticmethod与classmethod

原文地址https://blog.csdn.net/youngbit007/article/details/68957848 原文地址https://blog.csdn.net/weixin_35653315/article/details/78165645 原文地址https://www.cnblogs.com/1204guo/p/7832167.html 在Python里, 在class里定义的方法可以大致分为三类: 实例方法, 类方法与静态方法. 用一个表格总结如下: 方法类型 修饰 调用

Python:staticmethod vs classmethod

Being educated under Java background, static method and class method are the same thing. But not so in Python, there is subtle difference: Say function a() is defined in Parent Class, while Sub Class extends Parent Class If function a() has @staticme

python中@staticmethod、@classmethod和实例方法

1.形式上的异同点: 在形式上,Python中:实例方法必须有self,类方法用@classmethod装饰必须有cls,静态方法用@staticmethod装饰不必加cls或self,如下代码所示: 1 class A(object): 2 def __init__(self, name): 3 self.name = name 4 5 def get_a_object(self): 6 return "get object method:{}".format(self.name)

【引用】python 静态函数 类函数 实例函数

1.关于定义类的一些奇特之处  今天在Python中定义一个类,很奇怪,不需要事先声明它的成员变量吗?暂时不知,先记录下来: class Account(object):    "一个简单的类"    account_type="Basic"    def __init__(self,name,balance):        "初始化一个新的Account实例"        self.name=name        self.balance

飘逸的python - @staticmethod和@classmethod的作用与区别

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁. 既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢 从它们的使用上来看, @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. @cla

知识点 - python 装饰器@staticmethod和@classmethod区别和使用

1.通常来说,我们使用一个类的方法时,首先要实例化这个类,再用实例化的类来调用其方法 class Test(object): """docstring for Test""" def __init__(self, arg=None): super(Test, self).__init__() self.arg = arg def say_hi(self): print('hello wrold') def main(): test = Test(

python中静态方法(@staticmethod)和类方法(@classmethod)的区别

一般来说,要使用某个类的方法,需要先实例化一个对象再调用方法. 而使用@staticmethod或@classmethod,就可以不需要实例化,直接类名.方法名()来调用. 这有利于组织代码,把某些应该属于某个类的函数给放到那个类里去,同时有利于命名空间的整洁. 既然@staticmethod和@classmethod都可以直接类名.方法名()来调用,那他们有什么区别呢 从它们的使用上来看, @staticmethod不需要表示自身对象的self和自身类的cls参数,就跟使用函数一样. @cla

Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

Python类中的变量有类变量和实例变量之分. 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static 公有变量定义 Java 的定义方式 class Test{ public static class_variable = "123" } Python3 定义方式 class Test: class_variable = "123" 私有变量定义 Java 的定义方式 class Test{ private static class