首页 > 代码库 > Python2.7 学习体会 @classmethod @staticmethod @property 之间的关系二

Python2.7 学习体会 @classmethod @staticmethod @property 之间的关系二


先到百度找了一下资料,引用个重点,对比昨天实例来理解:

引用: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

-----------------------------------------------------------------------------------------

实例方法通过隐性参数绑定在类上,函数内通过隐性参数访问实例属性。

Python2.7 学习体会 @classmethod @staticmethod @property 之间的关系二