原文地址: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)进行数据验证;
代码:
- # -*- coding: utf-8 -*-
- #eclipse pydev, python 3.3
- #by C.L.Wang
- class Date(object):
- day = 0
- month = 0
- year = 0
- def __init__(self, day=0, month=0, year=0):
- self.day = day
- self.month = month
- self.year = year
- def display(self):
- return "{0}*{1}*{2}".format(self.day, self.month, self.year)
- @classmethod
- def from_string(cls, date_as_string):
- day, month, year = map(int, date_as_string.split(‘-‘))
- date1 = cls(day, month, year)
- return date1
- @staticmethod
- def is_date_valid(date_as_string):
- day, month, year = map(int, date_as_string.split(‘-‘))
- return day <= 31 and month <= 12 and year <= 3999
- date1 = Date(‘12‘, ‘11‘, ‘2014‘)
- date2 = Date.from_string(‘11-13-2014‘)
- print(date1.display())
- print(date2.display())
- print(date2.is_date_valid(‘11-13-2014‘))
- 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