Python绑定方法,未绑定方法,类方法,实例方法,静态方法
>>> class foo():
clssvar=[1,2]
def __init__(self):
self.instance=[1,2,3]
def hehe(self):
print 'haha' >>> foo.hehe
<unbound method foo.hehe>
>>> a=foo()
>>> a.hehe
<bound method foo.hehe of <__main__.foo instance at 0x01D60468>>
>>> foo.hehe()
Traceback (most recent call last):
File "<pyshell#35>", line 1, in <module>
foo.hehe()
TypeError: unbound method hehe() must be called with foo instance as first argument (got nothing instead)
非绑定方法必须被实例调用
class foo():
foovar=1
def __init__(self):
self.avar=3
def method(self):
methodvar=2
print 'hello',methodvar
class foo1(foo):
foo1var=4
def __init__(self,nm):
foo.__init__(self)
#调用非绑定方法——父类构造器
self.fooo=self.avar
print self.fooo
def method(self):
pass
a=foo1(2)
#1.这是我根据Python核心编程上的例子写的,我们要弄清楚一点:类里面的方法就是非绑定方法,实例里面的方法就是绑定的。
#2.既然上面说非绑定方法只能被实例调用,那么我们是如何调用一个类的非绑定方法的呢?实际上用类不能调用非绑定方法,无非是没有给
self参数,那么我们给它就是。
>>> foo.hehe(a)
haha
#self=a
同样的道理,调用父类构造器给子类用,那么直接给self(就是子类对象)就可以啦!
# 我们一般都是通过实例来调用,但也可以使用类来调用,比如上面通过调用父类的构造器可以避免子类调用时需要大量参数传递的情况
#coding=utf-8
class A(object):
count=1
def foo(self,x):
#类实例方法
print "executing foo(%s,%s)"%(self,x)
def foo2(self):
self.foo(5)
foo2var=self.count
@classmethod
def class_foo(cls):
#类方法
cls.count=cls.count+1 @staticmethod
def static_foo(x):
#静态方法
x+=1.1
print "executing static_foo(%s)"%x,id(x)
a=A()
b=A()
a.class_foo()
print a.count,b.count,A.count
b.class_foo()
print a.count,b.count,A.count
A.class_foo()
print a.count,b.count,A.count
打印结果
2 2 2
3 3 3
4 4 4 #可以看看我前一篇博文。一个类数据属性,只有通过类来调用时才会改变,通过实例来改变实际上不会对类产生影响。但是如果通过类方法来改,那么即便是实例调用也能改变类数据属性,这我觉得是很危险的。
#一般其它编程语言都会不允许实例调用类方法,比如Java,这样做的好处就是你能很轻松的利用类方法修改类属性。但Python允许实例调用类方法,但请不要这么做!
静态方法
#coding=utf-8
class A(object):
count=1
def foo(self,x):
#类实例方法
print "executing foo(%s,%s)"%(self,x)
def foo2(self):
self.foo(5)
foo2var=self.count
@classmethod
def class_foo(cls):
#类方法
cls.count=cls.count+1 @staticmethod
def static_foo(self,x):
#静态方法
x+=1.1
self.count=3
print "executing static_foo(%s)"%x,id(x)
a=A()
b=A()
a.static_foo(a,2)
print a.count,b.count,A.count
b.static_foo(b,3)
print a.count,b.count,A.count
A.static_foo(A,4)
print a.count,b.count,A.count
输出结果
executing static_foo(3.1) 20196512
3 1 1
executing static_foo(4.1) 20196512
3 3 1
executing static_foo(5.1) 20196512
3 3 3 #一般静态方法不要求你写self,但你可以这么干,同类数据属性的性质一样,类的静态方法修改会影响实例,实例却只影响自身
#id(x)告诉我们静态方法里的变量同样是静态的。
Python绑定方法,未绑定方法,类方法,实例方法,静态方法的更多相关文章
- Python - 面向对象(二)类方法、静态方法
面向对象的各种方法 静态方法 - @staticmethod class Person(): name = "cool guy" @staticmethod def static( ...
- python之静态属性、类方法、静态方法
静态属性.类方法.静态方法 1. 静态属性:在函数前加@property,将函数逻辑”封装“成数据属性,外部直接调用函数名,如同调用属性一样.这个函数是可以调用类和实例的属性的, 静态属性的作用 ...
- python day20面向对象-属性,类方法,静态方法
一.属性的初识 # class Person: # # def __init__(self,name,hight,weight): # self.name = name # self.__hight ...
- python的方法VSjava方法
java 类方法和实例方法 类方法 用static修饰的方法. 由于类方法是属于整个类的,所以类方法的方法体中不能有与类的对象有关的内容. 即类方法体有如下限制: 1.类方法中不能引用对象变量: 2. ...
- python基础--类的方法
一:类的方法说明 类的方法分为实例方法,析构方法,构造方法,类方法,静态方法,属性方法,等等 类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用 类方法的隐含调用参数是类,而类实例方 ...
- python 类中方法总结 --- 实例方法、类方法、静态方法
在python的类语法中,可以出现三种方法,具体如下: (1)实例方法 1)第一个参数必须是实例本身,一般使用[self]表示. 2)在实例方法中,可以通过[self]来操作实例属性,[类名]来操作类 ...
- day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态
Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...
- Python面向对象 --- 新旧式类、私有方法、类属性和类方法、静态方法
一.Python面向对象中的新旧式类 1)新式类(推荐使用):在定义类时,类后边括号里要继承基类(object).在python3.x中若没有指定父类,会默认使用的是object作为基类:在pytho ...
- Swift基础之init方法,实例方法,类方法(静态方法)的使用(多标签Demo)
Xcode更新过后,有些方法都进行了改变,Demo中有变化的都进行了简单的标记,具体以后遇见再说 创建一个UIView类,用init方法创建两种类型,显示多标签,创建静态方法进行调用,创建类方法进行调 ...
- python静态属性@property、类方法@classmethod、静态方法@staticmethod和普通方法
静态属性:即将类的函数通过@property属性封装,封装后实例调用该函数时,不再需要在函数后面加(),而是用类似调用数据属性的方式直接调用函数名称即可执行函数. 静态属性既可以访问类的属性,也可以访 ...
随机推荐
- WP8.1 Study18:动态磁贴
一.前言 动态磁贴在WindowsPhone8.1和Windows8.1都是其特色,有人喜欢有人讨厌,不过我觉得还是挺好的,可以让使用者很快知道App内的内容和吸引使用者打开App.下面来学习下怎样添 ...
- K2 BPM打造企业新门户,步入移动办公时代
公司介绍步步高教育电子有限公司(前身为步步高电脑电玩厂)是广东步步高电子工业有限公司属下的三个分公司之一,一直致力于面向广大学生的教育电子产品的研发与生产,主要产品有视频学习机.点读机.学生电脑.语言 ...
- Python学习资料整理以及书籍、开发工具推荐
我不知道大家学习Python的时候是不是和我一样感觉很无助,不知道在入门或者进阶的时候应该掌握哪些知识点,下面我就梳理下我自己学习Python开 发的过程及资料分享给大家,这些方法资料可能并不适合所有 ...
- Fragment的初步设计
Fragment的初步设计 Fragment功能 Fragment将每一段碎片时间归类到一个具体的事件上: 使用者可以创建多个事件对碎片时间进行分类: 使用者点击事件会进入用户自己设置好的事件对应的A ...
- SDK、MFC、QT界面生成的机制
1.SDK进行界面设计的机制 (1)设计窗口类 (2)注册窗口类 (3)创建窗口 (4)显示及更新窗口 (5)消息循环,操作系统接收到应用程序的窗口消息,将消息投递到队列中,通过GetMessage( ...
- C#异步批量下载文件
C#异步批量下载文件 实现原理:采用WebClient进行批量下载任务,简单的模拟迅雷下载效果! 废话不多说,先看掩饰效果: 具体实现步骤如下: 1.新建项目:WinBatchDownload 2.先 ...
- ActiveXObject函数详解
什么是 ActiveX 控件? ActiveX 控件广泛用于 Internet.它们可以通过提供视频.动画内容等来增加浏览的乐趣.不过,这些程序可能出问题或者向您提供不需要的内容.在某些情况下,这些程 ...
- 这些 Git 技能够你用一年了
这些 Git 技能够你用一年了 原文出处: Pyper 用git有一年了,下面是我这一年来的git使用总结,覆盖了日常使用中绝大多数的场景.嗯,至少是够用一年了,整理出来分享给大家,不明白的地方可以回 ...
- 计算纯文本情况下RichTextBox实际高度的正确方法(.NET)
2016-07-17重大更新 其实有更好.更系统的方法,也是最近才发现的,分享给大家!! /// <summary> /// /// </summary> ...
- NSDictionary读取数据类型异常问题.
起因:做网络交互时,经常会使用JSON作为数据的承载体,本来是件好事,但是用多了,发现iOS侧偶尔会出现异常,几经比较发现是服务器给的数据有问题,该给INT的给按照STR给了,服务器能做动态更新,可客 ...