Python 学习笔记(十五)Python类拓展(二)方法
方法
绑定方法和非绑定方法
绑定方法和非绑定方法在创建时没有任何区别,同一方法,既可以为绑定方法,也可以为非绑定方法,一切不同都只在调用时的手法上有所区别。
绑定方法即该方法绑定类的一个实例上,必须将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类拓展(二)方法的更多相关文章
- Python学习第十五篇——类继承和类实例化
学习Python类时,我们明白了类的本质,以及所谓的面向对象编程思想强调的对事物本身的属性,我们对某一类事物进行描述——采用了很多方法,这些方法描述了类的属性(比如猫科动物的眼睛,四肢,是否哺乳类等等 ...
- python 学习笔记十五 web框架
python Web程序 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. Python的WEB框架分为两类: 自己写socket,自 ...
- python 学习笔记十五 django基础
Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了ORM.模型绑定.模板引擎.缓存.Session等诸多功能. ...
- python学习笔记(十五)-unittest单元测试的一个框架
unittest 单元测试的一个框架什么框架 一堆工具的集合. TestCase TestSuite 测试套件,多个用例在一起 TestLoader是用来加载TestCase到TestSuite中的 ...
- Python学习第十五课——类的基本思想(实例化对象,类对象)
类的基本思想 类:把一类事物的相同的特征和动作整合到一起就是类类是一个抽象的概念 对象:就是基于类而创建的一个具体的事物(具体存在的)也是特征和动作整合到一块 对象写法 # 对象写法 def scho ...
- python学习笔记十五:日期时间处理笔记
#-*- coding: utf-8 -*- import datetime #给定日期向后N天的日期 def dateadd_day(days): d1 = datetime.datetime.no ...
- python学习笔记(十五)-异常处理
money = input('输入多少钱:') months = input('还几个月:') try: res = calc(int(money),int(months)) except ZeroD ...
- Python学习笔记整理(五)Python中的列表.
列表和字段,这两种类型几乎是Python所有脚本的主要工作组件.他们都可以在原处进行修改,可以按需求增加或缩短,而且包含任何种类的对象或者被嵌套. 一.列表 列表的主要属性: *任意对象的有序集合 从 ...
- python学习笔记(十六)-Python多线程多进程
一.线程&进程 对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程, ...
- python学习笔记(十四)python实现发邮件
import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart u ...
随机推荐
- bsgs(Baby Steps Giant Steps)算法
BSGS算法(Baby Steps Giant Steps算法,大步小步算法,北上广深算法,拔山盖世算法) 适用问题 对于式子: $$x^y=z(mod_p)$$ 已知x,z,p,p为质数: 求解一个 ...
- Http Status Code 套餐合集(转载)
1xx(临时响应) 表示临时响应并需要请求者继续执行操作的状态代码. 100(继续)请求者应当继续提出请求. 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分. 101(切换协议)请求者已要 ...
- PyCharm导入包的问题
在此之前,我们说一下虚拟环境这个概念: 在django项目中,直接就安装各种package,可能会造成系统混乱,因为package之间会有依赖的.比方说,你现在直接装django,他会依赖其他的包(开 ...
- 解析json结构绘制canvas
在工作中偶尔会遇到绘制转发卡/邀请卡的业务,且这个转发卡/邀请卡的风格会有很多,要求最后生成图片.这时候如果使用一张图片绘制一个canvas,这个工作量会相当大.分析一下转发邀请的内容,会发现所有的里 ...
- C#可遍历的集合
public class Product { /// <summary> /// 自增ID /// </summary> public int ID { get; set; } ...
- Angular入门教程三
4.6指令(directive) 通过使用模板,我们可以把model和controller中的数据组装起来呈现给浏览器,还可以通过数据绑定,实时更新视图,让我们的页面变成动态的. 模板中可以使用的东西 ...
- ArcGIS Pro 自定义坐标系地图矢量切片制作
ArcGIS Pro从1.4版本起就支持自定义坐标系统地图的矢量切片制作了. 步骤: 1. 将地图有全图范围缩小到屏幕像素大约10*10像素的范围,然后记录下地图的比例尺.这一步十分关键,不然系统要经 ...
- java中字节流与字符流以及字节流多余字节问题
1.字节流 字节流byte为单位对文件的数据进行写入与读取操作.字节的方式在复制音频图片文件时比较适用,但在对于普通文件的读写上有两大缺陷: 第一,字节流在读取中文字符时,若设定的字节数组长度刚好末尾 ...
- 求最大公约数和最大公倍数(Java算法)
最大公约数(最大公因数):指某几个整数共有约数中最大的一个. 求两个整数最大公约数主要的方法: 列举法:各自列出约数,再找出最大的公约数. 素因数分解法:两数各作素因数分解,然后取出共有的项乘起来. ...
- .net core系列之《新一代的配置系统Configuration在支持多数据源,热更新,层级化方面代码快速实践》
在我们之前.Net Framework的项目中,配置文件是WebConfig或AppcConfig文件,而当我们想要添加我们自定义的节点时,还需要在这个文件中的section中定义我们自定义的节点,这 ...