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属性封装,封装后实例调用该函数时,不再需要在函数后面加(),而是用类似调用数据属性的方式直接调用函数名称即可执行函数. 静态属性既可以访问类的属性,也可以访 ...
随机推荐
- Halcon 10.0:Sample 分割边缘拟合圆Circles.hdev
处理流程:快速二值化(区域)->获取区域边缘->截取边缘->膨胀边缘区域(定位)->定位区域进行边缘检测->边缘分割:线和圆->选择属性为圆的弧->拟合圆 * ...
- UIView及其子类
一.UI概述 UI(User Interface):用户界⾯,用户能看到的各种各样的⻚面元素. iOS App = 各种各样的UI控件 + 业务逻辑和算法 二.UIView 在手机上显示的内容都是UI ...
- 网页中插入QQ在线功能
网页中插入QQ在线功能 本随笔记录的是网页中如何插入qq在线聊天,这里讲解的是 普通QQ在线聊天操作. 例:第一种方式 使用 tencent://message/?uin=QQ号码&Site ...
- iOS打开百度地图、高德地图导航
1.判断手机里是否已经安装了百度地图或者高德地图: BOOL hasBaiduMap = NO; BOOL hasGaodeMap = NO; if ([[UIApplication sharedAp ...
- linux命令每日一练习-top free
top看看进程的内存使用情况 free产看内存使用情况 top -n 2 -b > log.txt 将更新两次的结果输入到log.txt cat > log.txt //清空文件并写入 ...
- 【转】MSM搭建(Memcached_Session_Manager)--解决集群session共享
一.环境 tomcat7三台,nginx(负载均衡),memcached(1.4.0) 需要的jar 二.memcached搭建 需要安装libevent 三.tomcat配置 在to ...
- checkbox选中与取消选择
先上代码 <form> 你爱好的运动是?<br/> <input type="checkbox" name="items" val ...
- C++ Daily 《3》----构造函数可否是虚函数
C++ 中构造函数可否是虚函数? 绝不要!! 而且,在构造函数中调用虚函数也是不提倡的行为,因为会引发预想不到的结果. 因为,在 derived class 对象构造的过程中,首先调用的是基类的构造函 ...
- JS URL参数传递 谷歌乱码解决
//第一个页面 var name=encodeURIComponent("参数"); var url="test1.html?name="+name; //第二 ...
- Android列出所有应用,点击可运行~
这个东西就比较容易了. MainActivity.class import android.app.Activity; import android.content.Context; import a ...