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

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

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

时间: 2024-10-10 21:34:09

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

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

先来一个实例场景,然后测试,比较,不懂的话到网上找资料: #!/usr/bin/env python #!/usr/bin/env python class Date(object):     def __init__(self,year=0,month=0,day=0):         self.year = year         self.month = month         self.day = day @staticmethod     def statictime(self

python 装饰器语法糖(@classmethod @staticmethod @property @name.)原理剖析和运用场景

引用:http://blog.csdn.net/slvher/article/details/42497781 这篇文章系统的介绍这几者之间的关系和区别.有兴趣的朋友可以到上面的链接查看原文,这里我把原文拷贝如下(如有侵权,通知马上删除) ==================================================================== 在阅读一些开源Python库的源码时,经常会看到在某个类的成员函数前,有类似于@staticmethod或@classme

峰Spring4学习(5)bean之间的关系和bean的作用范围

一.bean之间的关系: 1)继承: People.java实体类: package com.cy.entity; public class People { private int id; private String name; private int age; private String className; public int getId() { return id; } public void setId(int id) { this.id = id; } public Strin

linux学习笔记----权限与命令之间的关系(极重要)

一.权限与命令之间的关系 二.文件与目录的默认权限与隐藏权限 1)umask为默认的权限(通过umask -S)查看你的系统的默认权限. umask的分数是指该默认值需要减掉的权限,比如说umask=022,则该权限为u=7-0=7,g=7-2=5,o=7-2=5;即该权限为755 2)文件的隐藏属性chattr,lsattr(显示文件隐藏属性) chattr [=-=][ASacdistu]最常用的是a和i,其中a代表这个文件只能增加数据,而不能删除数据或修改数据.只有root有这个权限.i代

oc学习之封装与类之间的关系

1. 面向对象的特征-封装? 封装: 现实生活中的封装: 将很多的小东西 塞在1个大口袋里面. 好处: a. 对外部屏蔽. b. 方便管理. 代码的封装: 函数/方法 就是1种封装的体现: 将一段代码塞在函数/方法中. 好处: 屏蔽了内部的实现. 便于管理. 类是一种更高级别的封装: 1个类中封装数据的状态和行为. 将数据的状态和行为封装在了1个类中. 类中有很多复杂的实现. 对于外部而言无需关心. 只需要知道这个类是干啥的? 怎么用? 把哪些复杂的东西. 方法,属性.封装成1个类的整体. 2.

表与表之间的关系二

---恢复内容开始--- 导语: 把所有的数据都存放于一张表的弊端 1:表的组织结构复杂不清晰 2:浪费空间 3:扩展性极差 一. 寻找表与表之间的关系套路: 举例:emp 员工表         dep 部门表 步骤: part1: 1.先站在左表 emp 的角度 2.去找左表emp 的多条记录能否对应右表dep的一条记录 3.翻译2 的意义: 左表emp 的多条记录==>>多个员工 右表dep 的一条记录==>>一个部门 最终的翻译结果:多个员工是否可以属于同一个部门? 如果是

property装饰器函数 @classmethod @staticmethod isinstance和issubclass

property函数   让方法伪装成属性   还有一系列的装饰器函数 1 class Goods: 2 __discount = 0.8 3 def __init__(self,price): 4 self.__price = price 5 self.name = 'apple' 6 7 @property #伪装成属性 8 def price(self): 9 return self.__price * Goods.__discount 10 11 @price.setter #修改折扣

mybatis学习笔记(1):搭建开发环境,以及mybatis各个配置文件之间的关系

一.环境 1.myeclipse10.7 2.数据库:mysql 3.jdk:jdk1.8 4.jar包:mybatis3.2.0.jar mysql-connector-java-5.1.22-bin.jar    log4j-1.2.16.jar 二.步骤 1.新建一个web工程:mybatis001. 将所需Jar包都拷贝到工程的WebRoot\WEB-INF\lib目录下(或者建一个java工程) 2.mysql新建一个数据库表:mybatis001 3.在表中增加2条信息 4.新建以下

变革家五步投资法学习体会

变革家(Reformer),专注创业项目分析,帮股权投资者把好第一关! 拆解学院,是变革家的一个王牌课程,通过每周微信语音和网站内容形式,大力提升股权投资者的投资水平. 作为一名变革家的顶级Fans,最近认真完整地听取了其中的第十七课,"'五步投资法'精益投资,让你从业余到专业!" 之前都是在网站上学习文字版的内容,这次是认真参加了"微信课堂",及时学习了下. 自我感觉,这一课,非常好,可以说是"变革家课程体系的核心",所有的项目拆借报告.股权众