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学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
Python序列化基础知识(json/pickle)
Oct 19 Python
Python内置函数——__import__ 的使用方法
Nov 24 Python
flask框架视图函数用法示例
Jul 19 Python
Python实现爬取马云的微博功能示例
Feb 16 Python
Python基于opencv实现的简单画板功能示例
Mar 04 Python
python实现动态创建类的方法分析
Jun 25 Python
使用Python项目生成所有依赖包的清单方式
Jul 13 Python
Python如何使用input函数获取输入
Aug 06 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 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
php5 non-thread-safe和thread-safe这两个版本的区别分析
2010/03/13 PHP
PHP的可变变量名的使用方法分享
2012/02/05 PHP
php生成缩略图示例代码分享(使用gd库实现)
2014/01/20 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
JavaScript QueryString解析类代码
2010/01/17 Javascript
[原创]js获取数组任意个不重复的随机数组元素
2010/03/15 Javascript
stream.js 一个很小、完全独立的Javascript类库
2011/10/28 Javascript
js替换字符串的所有示例代码
2013/07/23 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
2015/04/05 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
Ajax分页插件Pagination从前台jQuery到后端java总结
2016/07/22 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
Node.js连接MongoDB数据库产生的问题
2017/02/08 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
分析python切片原理和方法
2017/12/19 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
在django中,关于session的通用设置方法
2019/08/06 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
Python脚本去除文件的只读性操作
2020/03/05 Python
Python优秀开源项目Rich源码解析的流程分析
2020/07/06 Python
Tod’s英国官方网站:意大利奢华手工制作手袋和鞋履
2019/03/15 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
幼儿园长自我鉴定
2013/10/17 职场文书
高中自我评价范文
2014/01/27 职场文书
初二生物教学反思
2014/02/03 职场文书
优秀教师个人总结
2015/02/11 职场文书
谢师宴学生致辞
2015/07/27 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
2019年关于小学生课外阅读情况的分析报告
2019/12/02 职场文书
OpenCV-Python直方图均衡化实现图像去雾
2021/06/07 Python