zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    HDU 4644 BWT (KMP)
    常数的值类型问题
    HDU 1395 2^x mod n = 1 (欧拉函数)
    HDU 5384 Danganronpa(AC自动机)
    9.自己实现linux中的tree
    8.底层文件库
    7.标准文件库
    7.gcc的使用
    5.文件I/O
    4.vim操作
  • 原文地址:https://www.cnblogs.com/killad/p/6915060.html
Copyright © 2011-2022 走看看