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

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

还有一篇:http://blog.csdn.net/carolzhang8406/article/details/6856817

静态函数(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.   
  3. #eclipse pydev, python 3.3  
  4. #by C.L.Wang  
  5.   
  6. class Date(object):  
  7.   
  8.     day = 0  
  9.     month = 0  
  10.     year = 0  
  11.   
  12.     def __init__(self, day=0, month=0, year=0):  
  13.         self.day = day  
  14.         self.month = month  
  15.         self.year = year  
  16.           
  17.     def display(self):  
  18.         return "{0}*{1}*{2}".format(self.day, self.month, self.year)  
  19.      
  20.     @classmethod  
  21.     def from_string(cls, date_as_string):  
  22.         day, month, year = map(int, date_as_string.split('-'))  
  23.         date1 = cls(day, month, year)  
  24.         return date1  
  25.      
  26.     @staticmethod  
  27.     def is_date_valid(date_as_string):  
  28.         day, month, year = map(int, date_as_string.split('-'))  
  29.         return day <= 31 and month <= 12 and year <= 3999  
  30.       
  31. date1 = Date('12', '11', '2014')  
  32. date2 = Date.from_string('11-13-2014')  
  33. print(date1.display())  
  34. print(date2.display())  
  35. print(date2.is_date_valid('11-13-2014'))  
  36. 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

转载于:https://www.cnblogs.com/Jacck/p/7790065.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值