方法

绑定方法和非绑定方法

绑定方法和非绑定方法在创建时没有任何区别,同一方法,既可以为绑定方法,也可以为非绑定方法,一切不同都只在调用时的手法上有所区别。

绑定方法即该方法绑定类的一个实例上,必须将self作为第一个参数传入,而这个过程是由Python自动完成。可以通过实例名.方法名(参数列表)来调用。

非绑定方法因为不绑定到实例上,所以在引用时通过类来进行引用。该过程不是 Python 自动完成,如果忘记传入实例,那么直接调用是肯定会出问题的。所以要调用类的非绑定方法时应该显示地提供一个实例作为第一个参数。使用类名.非绑定方法名(参数列表)的形式来进行引用

 >>> class Foo(object):
def bar(self):
print "normal class" >>> f =Foo()
>>> f.bar() #实例方法调用,不用显示的传入第一个参数self.
normal class
>>> Foo.bar(f) #类名.方法名 必须传入参数f
normal class
>>> Foo.bar
<unbound method Foo.bar> #非绑定方法的对象
>>> f.bar #绑定方法
<bound method Foo.bar of <__main__.Foo object at 0x0000000003370B00>>
>>> dir(Foo)#查看类的属性的名称
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar']
>>> Foo.__dict__ #特殊属性__dict__,作用查看类的属性,是字典形式,key是属性的名称,value相应属性对象的数据值
dict_proxy({'__dict__': <attribute '__dict__' of 'Foo' objects>, '__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__module__': '__main__', 'bar': <function bar at 0x0000000003FC5EB8>, '__doc__': None})
>>> Foo.__dict__['bar'] #查看bar是一个函数对象
<function bar at 0x0000000003FC5EB8>
  #desr.__get__(self,obj,type=None)
   #get、set、 del有人称为黑魔法,我们叫它描述器
 >>> Foo.__dict__['bar'].__get__(None,Foo) #第一个参数self赋值为None,意思是没有给定的实例,非绑定方法
<unbound method Foo.bar> #非绑定方法
>>> f.bar #绑定方法
<bound method Foo.bar of <__main__.Foo object at 0x0000000003370B00>>
>>> Foo.bar #非绑定方法
<unbound method Foo.bar>
>>> Foo.__dict__['bar'].__get__(f,Foo) #第一个参数self 给定一个实例,绑定方法
<bound method Foo.bar of <__main__.Foo object at 0x0000000003370B00>>
>>>
#小结:通过类来获取方法的时候,得到的是非绑定方法对象;通过实例来获取方法的时候,得到的是绑定方法对象

静态方法和类方法

语法上面的区别:

  • 静态方法不需要传入self参数,类成员方法需要传入代表本类的cls参数;
  • 静态方法是无法访问实例变量和类变量的,类成员方法无法访问实例变量但是可以访问类变量

使用的区别:

由于静态方法无法访问类属性,实例属性,相当于一个相对独立的方法,跟类其实并没有什么关系。这样说来,静态方法就是在类的作用域里的函数而已。

类方法:实例方法类似,不过其第一个参数一般是 cls (约定俗成)而不是 self。但是,如果我们直接将 self 换成 cls 来创建类方法是不对的,因为实例方法的首个参数也是任意的,只是统一使用 self 。python的解释器并没有说看见第一个参数是 cls 就知道这个是类方法,它还是将其当作是实例方法来对待,所以我们需要通过内建函数: classmethod() 来创建类方法。

示例:类方法

 #! /usr/bin/env python
#coding:utf-8 class Foo(object): one = 0 def __init__(self): #初始化函数
Foo.one =Foo.one + 1 #类属性+1 @classmethod #创建类方法
def get_class_attr(cls):#传递一个参数
return cls.one #参数对象的属性one if __name__ =="__main__":
f1 =Foo()
print "f1:",Foo.one
f2 =Foo()
print "f2:",Foo.one print f1.get_class_attr()
print "f1.one:",f1.one
print Foo.get_class_attr() print "*"*10
f1.one = 8 #实例one属性
Foo.one = 9 #类的one属性
print f1.one
print f1.get_class_attr()
print Foo.get_class_attr() #output
#f1: 1
#f2: 2
#
#f1.one: 2
#
#**********
#
#
#9
#小结:类方法的定义其实就是在方法前面要写上@classmethod,在定义方法时,跟一般方法一样,参数采用cls,目的是通过cls把类这个对象传入

静态方法

静态方法:就是类中的一个普通函数,它并没有默认传递的参数,在创建静态方法的时候,需要用到内置函数: staticmethod() 。

 #! /usr/bin/env python
#coding:utf-8 T =1 class Foo(object): def __init__(self,name):
self.name = name @staticmethod
def check_t():
T =1
return T def get_name(self):
if self.check_t():
return self.name
else:
return "no person" if __name__ == "__main__": f = Foo("cc")
name =f.get_name()
print name

Python 学习笔记(十五)Python类拓展(二)方法的更多相关文章

  1. Python学习第十五篇——类继承和类实例化

    学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...

  2. python 学习笔记十五 web框架

    python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...

  3. python 学习笔记十五 django基础

    Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...

  4. python学习笔记(十五)-unittest单元测试的一个框架

    unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...

  5. Python学习第十五课——类的基本思想(实例化对象,类对象)

    类的基本思想 类:把一类事物的相同的特征和动作整合到一起就是类类是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一块 对象写法 # 对象写法 def scho ...

  6. python学习笔记十五:日期时间处理笔记

    #-*- coding: utf-8 -*- import datetime #给定日期向后N天的日期 def dateadd_day(days): d1 = datetime.datetime.no ...

  7. python学习笔记(十五)-异常处理

    money = input('输入多少钱:') months = input('还几个月:') try: res = calc(int(money),int(months)) except ZeroD ...

  8. Python学习笔记整理(五)Python中的列表.

    列表和字段,这两种类型几乎是Python所有脚本的主要工作组件.他们都可以在原处进行修改,可以按需求增加或缩短,而且包含任何种类的对象或者被嵌套. 一.列表 列表的主要属性: *任意对象的有序集合 从 ...

  9. python学习笔记(十六)-Python多线程多进程

    一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...

  10. python学习笔记(十四)python实现发邮件

    import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart u ...

随机推荐

  1. 教程:让你的表单升级到CSS3和HTML5客户端验证

    今天我们一起来看看如何创建一个实用并且功能强大的表单,表单使用如今最热门的技术HTML5和css3来创建,并且可以通过HTML5进行客户端验证. 查看预览下载附件 第一步:策划表单功能 首先,我们得为 ...

  2. Swift Development – List of Resources You Must Bookmark

    Ever since the introduction of iOS, there is iOS development fever across the globe. Many iOS develo ...

  3. chrome devtools的debug相关

    搜索ctrl+p:搜索Sources面板中指定的文件:然后在主窗口文件标签右键选择reveal in navigator可以在目录中显示当前文件.ctrl+f:搜索devtool主显示窗口所在文件的指 ...

  4. How To Manage StartUp Applications In Ubuntu

    Ever felt the need to control startup applications in Ubuntu? You should, if you feel that your Ubun ...

  5. 用Java开发贪吃蛇游戏

    贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...

  6. Example of assigning attributes directly to an object name

    Student类 package com.itheima_05; /* * 学生类 * * 通过对象直接访问成员变量,会存在数据安全问题 * 这个时候,我们就想能不能不让外界的对象直接访问成员变量呢? ...

  7. 企业级Nginx增加日志选项

    日志介绍 目的:将用户的访问信息记录到指定的文件中由ngx_http_log_module模块负责 访问日志参数: access_log:指定日志文件的路径和使用何种日志格式记录日志 log_form ...

  8. iOS开发之UIView

    在iPhone里你能看到的.摸到的,都是UIView. 视图坐标系统: UIKit中的坐标都是基于这样的坐标系统:以左上角为坐标的原点,原点向下和向右为坐标轴方向. 坐标值由浮点数来表示,内容的布局和 ...

  9. Python2.7 - IMOOC - 1

    第一章 课程介绍 python 特点:优雅.明确.简单 python适合的领域:1.Web网站和各种网络服务:2.系统工具和脚本:3.作为"胶水"语言把其他语言开发的模块包装起来方 ...

  10. 安装Jdk,tomcat【转载】

    一.下载安装对应的jdk,并配置Java环境. 官网下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk-6u26-dow ...