举例讲解Python面相对象编程中对象的属性与类的方法


Posted in Python onJanuary 19, 2016

python 对象的属性
进入正题,来看一个实例来了解python中类,对象中公有属性,私有属性及局部变量,全局变量的区别.

root@10.1.6.200:~# cat object.py
#!/usr/bin/env python
#coding:utf8
 
class Dave():
  var1 = "class atribute,public atrribute var1" #类属性,公有属性var1
  __var2 = "class self atribute __var2"  #类的私有属性__var2
 
  def fun(self):
    self.var2 = "object public atrribute var2" #对象的公有属性var2
    self.__var3 = "object self atrribute __var3" #对象的私有属性__var3
    var4 = "Function of the local variable var4" #函数fun的局部变量
   
  def other(self):
    print self.__var3

根据上面代码后面加入以下代码可以实例化一个对象及获取类公有属性.

he = Dave()    #实例化一个对象he
print he.var1   #从实例中获取类的公有属性
print Dave.var1  #直接从类中获取公有属性
root@10.1.6.200:~# ./object.py
class atribute,public atrribute var1
class atribute,public atrribute var1

类的私有属性不能被类或对象直接调用

he = Dave()
print Dave.__var2
print he.__var2
root@10.1.6.200:~# ./object.py
Traceback (most recent call last):
 File "./object.py", line 19, in <module>
  print Dave.__var2
AttributeError: class Dave has no attribute '__var2'

但可以通过方法间接调用.

class Dave():
  var1 = "class atribute,public atrribute var1" #类属性,公有属性var1
  __var2 = "class self atribute __var2"  #类的私有属性__var2
   
  def other(self):
    print Dave.__var2   
 
he = Dave()
he.other()
root@10.1.6.200:~# ./object.py
class self atribute __var2

获取类方法中的对象的公有属性,需要先通过对象执行类中的方法.并通过对象调用该属性.

he = Dave()
liu = Dave()
he.fun()
print he.var2
print liu.var2
root@10.1.6.200:~# ./object.py
object public atrribute var2
Traceback (most recent call last): <span></span>       #对象liu由于没有调用fun方法所有就没有该属性.
File "./object.py", line 20, in <module>
  print liu.var2
AttributeError: Dave instance has no attribute 'var2'

对象的私有属性和类的私有属性类似,也不能被类或对象直接调用

he = Dave()
he.fun()
print he.__var3
root@10.1.6.200:~# ./object.py
Traceback (most recent call last):
 File "./object.py", line 18, in <module>
  print he.__var3
AttributeError: Dave instance has no attribute '__var3'

局部变量也不能被对象直接调用,可以在函数内部使用.

he = Dave()
he.fun()
print he.var4
root@10.1.6.200:~# ./object.py

Traceback (most recent call last):
 File "./object.py", line 18, in <module>
  print he.var4
AttributeError: Dave instance has no attribute 'var4'
def fun(self):
    self.var2 = "object public atrribute var2" #对象的公有属性var2
    self.__var3 = "object self atrribute __var3" #对象的私有属性__var3
    var4 = "Function of the local variable var4" #函数fun的局部变量
    print var4       #可以在函数内部直接打印,只在该函数内有用
    print self.__var3
 
he = Dave()
he.fun()
root@10.1.6.200:~# ./object.py
Function of the local variable var4
object self atrribute __var3

那么var4和self._var3有什么区别呢.目前看2个都在外部使用不了.下面在定义一个函数other调用.

def fun(self):
    self.var2 = "object public atrribute var2" #对象的公有属性var2
    self.__var3 = "object self atrribute __var3" #对象的私有属性__var3
    var4 = "Function of the local variable var4" #函数fun的局部变量
    print var4       #一个函数的局部变量在另外一个函数是访问不到的
    print self.__var3
   
  def other(self):
    print var4
    print self.__var3
 
he = Dave()
he.fun()
print "#"*100
he.other()
root@10.1.6.200:~# ./object.py
Function of the local variable var4
object self atrribute __var3
####################################################################################################
Traceback (most recent call last):   #会认为var4是全局变量打印.定义全局变量可在class 头加入 var4 = "global"
 File "./object.py", line 22, in <module>
  he.other()
 File "./object.py", line 16, in other
  print var4
NameError: global name 'var4' is not defined
#!/usr/bin/env python
#coding:utf8
var4 = "global"            #定义var4为全局变量
class Dave():
  var1 = "class atribute,public atrribute var1" #类属性,公有属性var1
  __var2 = "class self atribute __var2"  #类的私有属性__var2
 
  def fun(self):
    self.var2 = "object public atrribute var2" #对象的公有属性var2
    self.__var3 = "object self atrribute __var3" #对象的私有属性__var3
    var4 = "Function of the local variable var4" #函数fun的局部变量
    print var4
    print self.__var3
   
  def other(self):
    print var4
    print self.__var3       #可调用私有属性,前提是先调用fun
 
he = Dave()
he.fun()
print "#"*100
he.other()
root@10.1.6.200:~# ./object.py
Function of the local variable var4
object self atrribute __var3
####################################################################################################
global
object self atrribute __var3

python 类的方法
python类中的方法:公有方法,私有方法,类方法,静态方法.

下面通过一个实例了解它们之间的区别:

#!/usr/bin/env python
#coding:utf8
class Dave():
  name = "python"
 
  def fun1(self):        #定义公有方法
    print self.name
    print "i am public method"
 
  def __fun2(self):       #定义私有方法
    print self.name
    print "i am self method"

先来看公有方法和私有方法,加入以下代码输出

root@10.1.6.200:~# ./method.py    #直接调用对象公有方法没有问题
python
i am public method

私有方法和私有属性一样是被保护起来,不能直接调用对象的私有方法,但可以间接调用.

#!/usr/bin/env python
#coding:utf8
class Dave():
  name = "python"
 
  def fun1(self):        #定义公有方法
    print self.name
    print "i am public method"
    self.__fun2()
 
  def __fun2(self):       #定义私有方法
    print self.name
    print "i am self method"
 
he = Dave()
he.fun1()
root@10.1.6.200:~# ./method.py
python
i am public method
python
i am self method

公有属性是可以被类调用,但是公有方法是不可以被类直接调用.需要实例化对象调用.如果想一个方法被类直接调用的话,就需要转换,变成一个类方法.变成类方法有2种,比较简单的可以加装饰器.

@classmethod
  def classFun(self):      #定义类方法
    print self.name
    print "i am class method"
 
Dave.classFun()
root@10.1.6.200:~# ./method.py
python
i am class method

另一个方法比较麻烦,需要定义一个新的函数,以及使用classmethod方法转换函数为类方法.当然调用也需要使用新的该函数名字.

def classFun(self):      #定义类方法
    print self.name
    print "i am class method"
 
  classnewFun = classmethod(classFun)
 
 
Dave.classnewFun()       #被转换后的是一个类方法,原来classfun还是一个普通方法
root@10.1.6.200:~# ./method.py
python
i am class method

静态方法在使用中和类方法一样,也是为了让类中直接调用,区别定义时不加self.

@staticmethod
  def staticFun():       #d定义静态方法
    print Dave.name #注意不加self,直接打name也不行,会认为调用全局变量,需要使用类型加属性.
    print "i am static method"
 
Dave.staticFun()
oot@10.1.6.200:~# ./method.py
python
i am static method

同样也可以通过一个函数调用

def staticfun():       #定义静态方法
    print Dave.name
    print "i am static method"
 
  staticnewFun = staticmethod(staticFun)
 
Dave.staticnewFun()
root@10.1.6.200:~# ./method.py
python
i am static method
Python 相关文章推荐
Python运行的17个时新手常见错误小结
Aug 07 Python
Python基类函数的重载与调用实例分析
Jan 12 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
Python自动化测试ConfigParser模块读写配置文件
Aug 15 Python
python中 logging的使用详解
Oct 25 Python
用Python解决x的n次方问题
Feb 08 Python
python爬虫项目设置一个中断重连的程序的实现
Jul 26 Python
python实现的多任务版udp聊天器功能案例
Nov 13 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 Python
Python通过类的组合模拟街道红绿灯
Sep 16 Python
教你怎么用python爬取爱奇艺热门电影
May 20 Python
Python实现天气查询软件
Jun 07 Python
python结合API实现即时天气信息
Jan 19 #Python
Python+django实现文件下载
Jan 17 #Python
Python+django实现文件上传
Jan 17 #Python
初步剖析C语言编程中的结构体
Jan 16 #Python
举例讲解Python设计模式编程的代理模式与抽象工厂模式
Jan 16 #Python
python实现发送和获取手机短信验证码
Jan 15 #Python
详解python单例模式与metaclass
Jan 15 #Python
You might like
关于PHP二进制流 逐bit的低位在前算法(详解)
2013/06/13 PHP
关于PHP堆栈与列队的学习
2013/06/21 PHP
php将字符串转换成16进制的方法
2015/03/17 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
jquery.AutoComplete.js中文修正版(支持firefox)
2010/04/09 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
阻止子元素继承父元素事件具体思路及实现
2013/05/02 Javascript
5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
2015/01/29 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
Javascript简单实现面向对象编程继承实例代码
2015/11/27 Javascript
javascript结合Flexbox简单实现滑动拼图游戏
2016/02/18 Javascript
Vue.js学习笔记之 helloworld
2016/08/14 Javascript
angular 用拦截器统一处理http请求和响应的方法
2017/06/08 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
[53:13]2014 DOTA2国际邀请赛中国区预选赛5.21 DT VS LGD-GAMING
2014/05/22 DOTA
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python字符串处理实例详解
2017/05/18 Python
Python实现的基数排序算法原理与用法实例分析
2017/11/23 Python
Pandas 合并多个Dataframe(merge,concat)的方法
2018/06/08 Python
Python利用WMI实现ping命令的例子
2019/08/14 Python
python retrying模块的使用方法详解
2019/09/25 Python
python将邻接矩阵输出成图的实现
2019/11/21 Python
细数nn.BCELoss与nn.CrossEntropyLoss的区别
2020/02/29 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
详解Django中异步任务之django-celery
2020/11/05 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
高校毕业生自我鉴定
2013/10/27 职场文书
如何写好建议书
2014/03/13 职场文书
优乐美广告词
2014/03/14 职场文书
基层党员对照检查材料
2014/09/24 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
2014年个人售房协议书
2014/10/30 职场文书
会议营销主持词
2015/07/03 职场文书