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中的生成器和yield详细介绍
Jan 09 Python
python smtplib模块发送SSL/TLS安全邮件实例
Apr 08 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
python最小生成树kruskal与prim算法详解
Jan 17 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
Python流行ORM框架sqlalchemy安装与使用教程
Jun 04 Python
Python实现大数据收集至excel的思路详解
Jan 03 Python
python dumps和loads区别详解
Feb 04 Python
Tkinter中复选菜单是否被选中的判断与设置方式
Mar 04 Python
重写django的model下的objects模型管理器方式
May 15 Python
python连接mysql有哪些方法
Jun 24 Python
Python必须了解的35个关键词
Jul 16 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实现字符串反转输出的方法
2015/03/14 PHP
Laravel 集成 Geetest验证码的方法
2018/05/14 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
jQuery动态添加 input type=file的实现代码
2012/06/14 Javascript
jQuery实现密保互斥问题解决方案
2013/08/16 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
JavaScript中rem布局在react中的应用
2015/12/09 Javascript
完美解决IE不支持Data.parse()的问题
2016/11/24 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
Vue实现一个返回顶部backToTop组件
2017/07/25 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
深入理解javascript中的this
2021/02/08 Javascript
[02:41]DOTA2英雄基础教程 亚巴顿
2014/01/02 DOTA
Python中给List添加元素的4种方法分享
2014/11/28 Python
使用Python的Twisted框架编写非阻塞程序的代码示例
2016/05/25 Python
python的dataframe和matrix的互换方法
2018/04/11 Python
在Python中使用defaultdict初始化字典以及应用方法
2018/10/31 Python
Python使用python-docx读写word文档
2019/08/26 Python
Python基础之字符串常见操作经典实例详解
2020/02/26 Python
Django基于客户端下载文件实现方法
2020/04/21 Python
Python爬虫HTPP请求方法有哪些
2020/06/03 Python
PHP面试题及答案一
2012/06/18 面试题
城市轨道专业个人求职信范文
2013/09/23 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
保安岗位职责
2014/02/21 职场文书
捐书倡议书
2014/08/29 职场文书
大学军训的体会
2014/11/08 职场文书
担保书范文
2019/07/09 职场文书
CSS3 制作的书本翻页特效
2021/04/13 HTML / CSS
Pytorch 如何实现常用正则化
2021/05/27 Python
Javascript 解构赋值详情
2021/11/17 Javascript
漫画「狩龙人拉格纳」公开TV动画预告图
2022/03/22 日漫
前端与RabbitMQ实时消息推送未读消息小红点实现示例
2022/07/23 Java/Android