方法

绑定方法和非绑定方法

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

绑定方法即该方法绑定类的一个实例上,必须将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. SublimeText 批量清除空行

    sublimeText 编辑器批量清除空行: 1.CTRL+H 打开 replace 功能 2.选择 Regular expression 功能 3.批两替换  点击replace All

  2. LeetCode赛题393----UTF-8 Validation

    393. UTF-8 Validation A character in UTF8 can be from 1 to 4 bytes long, subjected to the following ...

  3. Wasserstein GAN最新进展:从weight clipping到gradient penalty,更加先进的Lipschitz限制手法

    前段时间,Wasserstein GAN以其精巧的理论分析.简单至极的算法实现.出色的实验效果,在GAN研究圈内掀起了一阵热潮(对WGAN不熟悉的读者,可以参考我之前写的介绍文章:令人拍案叫绝的Was ...

  4. Cloudera Manager5及CDH5在线(cloudera-manager-installer.bin)安装详细文档

    问题导读:1.Cloudera Manager5如何使用cloudera-manager-installer.bin安装?2.Cloudera Manager5安装被中断该如何继续安装?还是重新安装? ...

  5. String class fetch functionality

    String类的获取功能: package com.itheima_04; /* * String类的获取功能: * int length():获取字符串的长度,其实也就是字符个数 * char ch ...

  6. svn提示out of date的解决方法

    步骤1. team–>update 步骤2. team–>Show Tree Conflict–>标记"冲突已解决" 步骤3. team–>commit

  7. package.json作用

    这个文档的内容是你必须要知道的,它必须是JSON文本格式.每个项目的根目录下面,一般都有一个package.json文件,定义了这个项目所需要的各种模块,以及项目的配置信息(比如名称.版本.许可证等元 ...

  8. NexusFile(文件管理器)

    NexusFile是一款来自于韩国的文件管理器,类似于TotalCommander,拥有两个并排的文件夹窗口. NexusFile软件的特性如下: 基本功能:复制/移动, 复制/剪切/粘贴, 删除/擦 ...

  9. 五、python小功能记录——打包程序

    使用pyinstaller打包Python程序 安装工具 :pip3 install pyinstaller 在Python程序文件夹上(不点进去)按住shift并且右键,在弹出的选项中点击" ...

  10. Visual Studio强行修改运行平台和注意事项

    默认情况下,会发现项目属性中只有一个Any CPU可供选择,无法修改运行平台. 解决方法如下: 右键“解决方案”,选择“属性”,此时发现每一个项目的平台依然只有Any CPU,点击右上角“配置管理器” ...