Python属性和内建属性实例解析


Posted in Python onJanuary 14, 2020

这篇文章主要介绍了Python属性和内建属性实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1. 私有属性添加getter和setter方法

class Money(object):
  def __init__(self):
    self.__money = 0

  def getMoney(self):
    return self.__money

  def setMoney(self, value):
    if isinstance(value, int):
      self.__money = value
    else:
      print("error:不是整型数字")

2. 使用property升级getter和setter方法

class Money(object):
  def __init__(self):
    self.__money = 0

  def getMoney(self):
    return self.__money

  def setMoney(self, value):
    if isinstance(value, int):
      self.__money = value
    else:
      print("error:不是整型数字")
  money = property(getMoney, setMoney)

运行结果:

In [1]: from get_set import Money

In [2]: 

In [2]: a = Money()

In [3]: 

In [3]: a.money
Out[3]: 0

In [4]: a.money = 100

In [5]: a.money
Out[5]: 100

In [6]: a.getMoney()
Out[6]: 100

3. 使用property取代getter和setter方法

@property成为属性函数,可以对属性赋值时做必要的检查,并保证代码的清晰短小,主要有2个作用

将方法转换为只读

重新实现一个属性的设置和读取方法,可做边界判定

class Money(object):
  def __init__(self):
    self.__money = 0

  @property
  def money(self):
    return self.__money

  @money.setter
  def money(self, value):
    if isinstance(value, int):
      self.__money = value
    else:
      print("error:不是整型数字")

运行结果

In [3]: a = Money()

In [4]: 

In [4]: 

In [4]: a.money
Out[4]: 0

In [5]: a.money = 100

In [6]: a.money
Out[6]: 100

内建属性

"teachclass.py"
class Person(object):
  pass

python3.5中类的内建属性和方法

Python属性和内建属性实例解析

经典类(旧式类),早期如果没有要继承的父类,继承里空着不写的类

#py2中无继承父类,称之经典类,py3中已默认继承object
class Person:
  pass

子类没有实现__init__方法时,默认自动调用父类的。 如定义__init__方法时,需自己手动调用父类的__init__方法

Python属性和内建属性实例解析

__getattribute__例子:

class Itcast(object):
  def __init__(self,subject1):
    self.subject1 = subject1
    self.subject2 = 'cpp'

  #属性访问时拦截器,打log
  def __getattribute__(self,obj):
    if obj == 'subject1':
      print('log subject1')
      return 'redirect python'
    else:  #测试时注释掉这2行,将找不到subject2
      return object.__getattribute__(self,obj)

  def show(self):
    print('this is Itcast')

s = Itcast("python")
print(s.subject1)
print(s.subject2)

运行结果:

log subject1
redirect python
cpp

**__getattribute__的坑**

class Person(object):
    def __getattribute__(self,obj):
      print("---test---")
      if obj.startswith("a"):
        return "hahha"
      else:
        return self.test

    def test(self):
      print("heihei")

  t.Person()
  t.a #返回hahha
  t.b #会让程序死掉
    #原因是:当t.b执行时,会调用Person类中定义的__getattribute__方法,但是在这个方法的执行过程中
    #if条件不满足,所以 程序执行else里面的代码,即return self.test 问题就在这,因为return 需要把
    #self.test的值返回,那么首先要获取self.test的值,因为self此时就是t这个对象,所以self.test就是
    #t.test 此时要获取t这个对象的test属性,那么就会跳转到__getattribute__方法去执行,即此时产
    #生了递归调用,由于这个递归过程中 没有判断什么时候推出,所以这个程序会永无休止的运行下去,又因为
    #每次调用函数,就需要保存一些数据,那么随着调用的次数越来越多,最终内存吃光,所以程序 崩溃
    #
    # 注意:以后不要在__getattribute__方法中调用self.xxxx

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于phantomjs实现导入图片
May 13 Python
python与php实现分割文件代码
Mar 06 Python
详谈python http长连接客户端
Jun 12 Python
Python面向对象编程基础解析(一)
Oct 26 Python
分数霸榜! python助你微信跳一跳拿高分
Jan 08 Python
python实现QQ空间自动点赞功能
Apr 09 Python
Django 配置多站点多域名的实现步骤
May 17 Python
代码实例讲解python3的编码问题
Jul 08 Python
解决python 读取 log日志的编码问题
Dec 24 Python
Jupyter Notebook打开任意文件夹操作
Apr 14 Python
Python实现寻找回文数字过程解析
Jun 09 Python
python Zmail模块简介与使用示例
Dec 19 Python
Python程序控制语句用法实例分析
Jan 14 #Python
dpn网络的pytorch实现方式
Jan 14 #Python
Django之form组件自动校验数据实现
Jan 14 #Python
简单了解python filter、map、reduce的区别
Jan 14 #Python
Python vtk读取并显示dicom文件示例
Jan 13 #Python
Python解析多帧dicom数据详解
Jan 13 #Python
python 将dicom图片转换成jpg图片的实例
Jan 13 #Python
You might like
一些PHP写的小东西
2006/12/06 PHP
非常精妙的PHP递归调用与静态变量使用
2012/12/16 PHP
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
Yii框架组件的事件机制原理与用法分析
2020/04/07 PHP
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
JavaScript Array扩展实现代码
2009/10/14 Javascript
JQuery中判断一个元素下面是否有内容或者有某个标签的判断代码
2012/02/02 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
2016/12/08 Javascript
bootstrap弹出层的多种触发方式
2017/05/10 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
vue引入微信sdk 实现分享朋友圈获取地理位置功能
2019/07/04 Javascript
Vue3 中的数据侦测的实现
2019/10/09 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
js模拟实现百度搜索
2020/06/28 Javascript
vue-router 按需加载 component: () => import() 报错的解决
2020/09/22 Javascript
Python字典操作简明总结
2015/04/13 Python
浅谈python中的__init__、__new__和__call__方法
2017/07/18 Python
python opencv人脸检测提取及保存方法
2018/08/03 Python
解决安装pycharm后不能执行python脚本的问题
2019/01/19 Python
python使用wxpy轻松实现微信防撤回的方法
2019/02/21 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
使用虚拟环境打包python为exe 文件的方法
2019/08/29 Python
解决django后台管理界面添加中文内容乱码问题
2019/11/15 Python
Python中类似于jquery的pyquery库用法分析
2019/12/02 Python
Python字典底层实现原理详解
2019/12/18 Python
Python中包的用法及安装
2020/02/11 Python
python 匿名函数与三元运算学习笔记
2020/10/23 Python
学生实习推荐信范文
2013/11/26 职场文书
如何写辞职书
2015/02/26 职场文书
争先创优个人总结
2015/03/04 职场文书
养成教育工作总结
2015/08/13 职场文书
国庆节主题班会
2015/08/15 职场文书
Win11 Build 21996.1 Dev版怎么样? win11系统截图欣赏
2021/11/21 数码科技
Win11如何查看显卡型号 Win11查看显卡型号的方法
2022/08/14 数码科技