先到百度找了一下资料,引用个重点,对比昨天实例来理解:
引用:http://blog.csdn.net/carolzhang8406/article/details/6856817
在Python中,静态方法和类方法都是可以通过类对象和类对象实例访问。但是区别是:
- @classmethod 是一个函数修饰符,它表示接下来的是一个类方法,而对于平常我们见到的则叫做实例方法。 类方法的第一个参数cls,而实例方法的第一个参数是self,表示该类的一个实例。
- 普通对象方法至少需要一个self参数,代表类对象实例
- 类方法有类变量cls传入,从而可以用cls做一些相关的处理。并且有子类继承时,调用该类方法时,传入的类变量cls是子类,而非父类。 对于类方法,可以通过类来调用,就像C.f(),有点类似C++中的静态方法, 也可以通过类的一个实例来调用,就像C().f(),这里C(),写成这样之后它就是类的一个实例了。
- 静态方法则没有,它基本上跟一个全局函数相同,一般来说用的很少
引用:http://www.cnblogs.com/agnewee/p/5653936.html
@classmethod 优势特点:
- 在一个地方解析日期字符串并且重复使用它。
- 做到很好的封装(相对于把执行字符串解析作为一个单独的函数在任何地方执行,这里使用的方法更符合
OOP
的范式) cls
表示类对象,而不是类实例。这样很酷,因为如果我们继承Date
类,那么所有的子类也都将拥有from_string
这个方法- 类方法通过隐性参数绑定在类上,函数内可通过隐性参数进行实例生成。
- calssmethod 方法,可以通过类和实例直接调用
---------------------------------------------------------------------------------------------------
@staticmethod 特点:
那么staticmethod又是什么呢?它和classmethod非常的相似,但是不强制要求传递参数(但是做的事与类方法或实例方法一样)。
让我们来看一个使用的例子。
我们有一个日期字符串需要以某种方式验证。这个任务与之前一样要定义在Date
类内部,但是不要求实例化它。
静态方法在这种情况下就非常有用。看一下下面这个代码片段:
@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
is_date = Date.is_date_valid('11-09-2012')
现在正如我们了解到的staticmethod
的使用,我们不需要访问它所属的类,它本质上就是一个函数,调用方式和调用函数一样.静态方法无绑定,和普通函数使用方法一样,只是需要通过类或者实例来调用。没有隐性参数。
---------------------------------------------------------------------------------------------------------
@porperty 特点:
只读方法,实例调用不能输入参数。
引用:http://blog.csdn.net/my2010sam/article/details/8585336
@property 就是给函数设置只读属性。
这里定义的属性是一个只读属性,如果需要可写,则需要再定义一个setter:
class Rabbit(object):
def __init__(self,name):
self._name = name
@classmethod
def newClass(cls):
return 'abc',cls,Rabbit('')
@property
def name(self):
return self._name
@name.setter
def name(self,newname):
self._name= newname
-----------------------------------------------------------------------------------------
实例方法通过隐性参数绑定在类上,函数内通过隐性参数访问实例属性。