Python面向对象加强1.关于经典类、新式类和property详解

  • 一、经典类和新式类
  • 二、property属性详解
  • 1.关于property属性(装饰器):
  • 2、property属性的用法
    • 应用于类属性
    • 在类的实例方法上应用@property装饰器
  • 三、只读属性的三种种设置方法

一、经典类和新式类

经典类: class People:
新式类: class People(object):

**我们所接触到的类,都是新式类。同时,在 Python 2.X 相关的版本中,还存在另外一种称之为 “经典类”的类。**主要区别在于,在 Python 2.X 相关的版本中定义一个类时,默认不继承(object),而在 Python 3.X相关版本中,默认继承(object)。

二、property属性详解

1.关于property属性(装饰器):

一种用起来像是使用的实例属性一样的特殊属性,
可以对应于某个方法,希望能够像调用属性一样来调用方法 此时可以将一个方法加上property
将该函数方法,当做属性,不用()也可以执行。说白了就是用一系列方法做出类似于属性的操作。
说起来可能不太明白,先来看一个常规操作:

class Person(object):def __init__(self):self.__age=18@property  # 主要作用就是,可以使用属性的方式,来使用这个方法def age(self):return self.__agep=Person()
print(p.age)


此时虽然age是一个方法,但是并不需要p.age()这样调用,而是像一个使用属性一样调用(p.age),但是并不能此时做赋值操作,age此时就相当于一个只读属性。

2、property属性的用法

先来看一下python源码中对于property的注释:

"""Property attribute.fgetfunction to be used for getting an attribute valuefsetfunction to be used for setting an attribute valuefdelfunction to be used for del'ing an attributedocdocstringTypical use is to define a managed attribute x:class C(object):def getx(self): return self._xdef setx(self, value): self._x = valuedef delx(self): del self._xx = property(getx, setx, delx, "I'm the 'x' property.")Decorators make defining new properties or modifying existing ones easy:class C(object):@propertydef x(self):"I am the 'x' property."return self._x@x.setterdef x(self, value):self._x = value@x.deleterdef x(self):del self._x"""

重点在于:

class C(object):def getx(self): return self._xdef setx(self, value): self._x = valuedef delx(self): del self._xx = property(getx, setx, delx, "I'm the 'x' property.")

和:

class C(object):@propertydef x(self):"I am the 'x' property."return self._x@x.setterdef x(self, value):self._x = value@x.deleterdef x(self):del self._x

可以看出propety有两种应用场景,一种是在类中定义值为property对象的类属性,一种是在方法上应用装饰器
先来说第一种:

应用于类属性

由源码可知
property方法中有个四个参数
第一个参数是方法名,调用 对象.属性 时自动触发执行方法
第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
第四个参数是字符串,调用 对象(类).属性.doc ,此参数是该属性的描述信息

class Person(object):def __init__(self):self.__age = 18def get_age(self):return self.__agedef set_age(self, value):self.__age = valuedef del_age(self):del self.__ageage = property(get_age, set_age, del_age, "description")p = Person()
print(p.age)  # 读取age属性p.age = 90
print(p.age)  # 更改age属性# 为了验证此时 p.age=90 并不是为p对象新增了一个实例属性,做一下验证
print(p.__dict__)  # 打印所有对象属性a = Person.age.__doc__  # 获取age的描述
# 注意此时不是p.age.__doc__,因为age是一个类属性
print(a)del p.age  # 删除age属性
try:print(p.age)
except(AttributeError):print("age属性已经被删除")


然后是第二种:

在类的实例方法上应用@property装饰器

首先是在经典类(python2.x)中,property只有一种装饰器使用方法

# _*_ encoding:utf-8 _*_
class Person:__age=18@propertydef age(self):return Person.__agep=Person()
a=p.age
print(a)

18

*然后是新式类,具有三种@property装饰器。对于获取、修改、删除分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法,示例如下:

class Person:def __init__(self):self.__age=18@propertydef age(self):return self.__age@age.setterdef age(self,value):self.__age=value@age.deleterdef age(self):del self.__agep = Person()
print(p.age)  # 读取age属性p.age = 90
print(p.age)  # 更改age属性# 为了验证此时 p.age=90 并不是为p对象新增了一个实例属性,做一下验证
print(p.__dict__)  # 打印所有对象属性del p.age  # 删除age属性
try:print(p.age)
except(AttributeError):print("age属性已经被删除")

三、只读属性的三种种设置方法

第一种就是使用property装饰器设置

class Person:def __init__(self):self.__age=18@propertydef age(self):return self.__age@age.setterdef age(self,value):self.__age=value@age.deleterdef age(self):del self.__agep = Person()
print(p.age)  # 读取age属性p.age = 90
print(p.age)  # 更改age属性# 为了验证此时 p.age=90 并不是为p对象新增了一个实例属性,做一下验证
print(p.__dict__)  # 打印所有对象属性del p.age  # 删除age属性
try:print(p.age)
except(AttributeError):print("age属性已经被删除")

第二种是用property方法设置

class Person(object):def __init__(self):self.__age = 18def get_age(self):return self.__agedef set_age(self, value):self.__age = valuedef del_age(self):del self.__ageage = property(get_age, set_age, del_age, "description")p = Person()
print(p.age)  # 读取age属性p.age = 90
print(p.age)  # 更改age属性# 为了验证此时 p.age=90 并不是为p对象新增了一个实例属性,做一下验证
print(p.__dict__)  # 打印所有对象属性a = Person.age.__doc__  # 获取age的描述
# 注意此时不是p.age.__doc__,因为age是一个类属性
print(a)del p.age  # 删除age属性
try:print(p.age)
except(AttributeError):print("age属性已经被删除")

第三种是 通过定义__setattr__方法实现
__setattr__方法: 当我们通过 实例.属性 = 值,给一个实例增加一个属性,或者说修改一下属性值的时候,都会调用这个方法。在这个方法内部,才会真正的把,整数型,以及对应的数据,给存储到__dict__里面


class Person:# 当我们通过 实例.属性 = 值,给一个实例增加一个属性,或者说修改一下属性值的时候,都会调用这个方法#在这个方法内部,才会真正的把,整数型,以及对应的数据,给存储到__dict__里面def __setattr__(self, key, value):print(key,value)# 1.判定,key,是否是我们要设置的只读属性的名称if key =="age" and key in self.__dict__.keys(): # 第一次给只读属性赋值的操作是允许的print("只读属性不能设置数据。。。")# 2. 如果不是只读属性,就把他添加到这个实例里边else:# self.key = value 不能这么写,会进入死循环调用self.__dict__[key] = valuep=Person()
p.age=20
print(p.age)
p.age=18
p.name='jaing'
print(p.__dict__)

Python面向对象加强1.关于经典类、新式类和property详解相关推荐

  1. python面向对象难学_学不下去了!?详解Python面向对象核心概念,简历没跑了

    目前代码技能已经成了测试同学面试考核的刚需,对于测试开发来讲需求最大的是java和python两门语言,二者也都是面向对象语言.对于刚入门代码的同学来说面向对象相关的概念比较难于理解,而面向对象编程相 ...

  2. python中的__new__与__init__,新式类和经典类(2.x)

    在python2.x中,从object继承得来的类称为新式类(如class A(object))不从object继承得来的类称为经典类(如class A()) 新式类跟经典类的差别主要是以下几点: 1 ...

  3. python经典类新式类_Python新式类与经典类(旧式类)的区别

    看写poc的时候看到的,思考了半天,现在解决了 转载自http://blog.csdn.net/zimou5581/article/details/53053775 Python中类分两种:旧式类和新 ...

  4. python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...

  5. python 函数参数self_Python类中self参数用法详解

    Python编写类的时候,每个函数参数第一个参数都是self,一开始我不管它到底是干嘛的,只知道必须要写上.后来对Python渐渐熟悉了一点,再回头看self的概念,似乎有点弄明白了. 首先明确的是s ...

  6. python调用包中的方法_python 中不同包 类 方法 之间的调用详解

    目录结构如下: 在hello.py中导入ORM.py这个文件的时候,采用 import ORMPackage.ORM 或者 import ORM u = User(id = 123, name='co ...

  7. python3d动态图-Python图像处理之gif动态图的解析与合成操作详解

    本文实例讲述了Python图像处理之gif动态图的解析与合成操作.分享给大家供大家参考,具体如下: gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图.这里,就介绍下如何使用python ...

  8. Java经典面试题整理及答案详解(八)

    简介: Java经典面试题第八节来啦!本节面试题包含了进程.线程.Object类.虚拟内存等相关内容,希望大家多多练习,早日拿下心仪offer- 了解更多: Java经典面试题整理及答案详解(一) J ...

  9. Java经典面试题整理及答案详解(三)

    简介: 以下是某同学面试时,面试官问到的问题,关于面试题答案可以参考以下内容- 上一篇:Java经典面试题整理及答案详解(二) Java面试真题第三弹接住!相信通过前两节的学习,大家对于Java多少有 ...

  10. python怎么去掉视频字幕_利用Python实现字幕挂载(把字幕文件与视频合并)思路详解...

    其实超简单超简单!python好现成的库,一下子省略了好多步骤! 本文在Windows环境下!linux只是不需要手动输入imagicmagick的位置! 需要用到的环境 python(基本上只要不是 ...

最新文章

  1. 设置用户帐号只能一个地方登录
  2. 数值优化(Numerical Optimization)学习系列-文件夹
  3. 检验xpath的小妙招
  4. java中hashcode()和equals()的详解[转]
  5. Amazon Aurora 深度探索
  6. 走进双亲委派机制LoadClass
  7. 关键词词云怎么做_网友问:做独立站,怎么做关键词排名,怎么做客户流量?...
  8. LeetCode每日一题(20200820)
  9. Android Studio 全局搜索技巧
  10. 软件测试工程师未来十年的职业规划
  11. 微信网页游戏刷分BUG利用——抓包分析记录
  12. 静水流深2010年版系列教程[转]
  13. 【软件project】 文档 - 银行业务管理 - 需求分析
  14. Java高级工程师必备知识!kafka消费topic命令
  15. maya(学习笔记)之Arnold渲染器二
  16. [干货满满] 三年经验前端的面试经验分享
  17. Unity3d实现的十字路口的模拟(五)
  18. 一次性免费临时邮箱,专注个人隐私保护
  19. 游戏建模一般使用什么软件?
  20. html滚动字幕如何调色,如何通过制作滚动字幕的软件实现这种片尾的向上滚动字幕效果...

热门文章

  1. SpringBoot集成SpringSecurity步骤
  2. 课后作业3:软件分析与用户体验分析
  3. V4 乱码问题总结 v5 也可以参考
  4. 关于Tomcat和Servlet容器的小结
  5. 弘辽科技:直通车总集篇(下篇)
  6. 5G关键技术之D2D通信技术
  7. 关于主数据管理及病人主索引的说明
  8. 【软考软件评测师】第二十五章 系统安全设计(网络攻击)
  9. VTK学习笔记(二十八)ExtractEnclosedPoints python示例
  10. JAVA 使用 pdfbox实现打印 PDF 文件 (横版,竖版)