IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python面向对象加强1.关于经典类、新式类和property详解 -> 正文阅读

[Python知识库]Python面向对象加强1.关于经典类、新式类和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.__age

p=Person()
print(p.age)

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

2、property属性的用法

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

"""
    Property attribute.
    
      fget
        function to be used for getting an attribute value
      fset
        function to be used for setting an attribute value
      fdel
        function to be used for del'ing an attribute
      doc
        docstring
    
    Typical use is to define a managed attribute x:
    
    class C(object):
        def getx(self): return self._x
        def setx(self, value): self._x = value
        def delx(self): del self._x
        x = property(getx, setx, delx, "I'm the 'x' property.")
    
    Decorators make defining new properties or modifying existing ones easy:
    
    class C(object):
        @property
        def x(self):
            "I am the 'x' property."
            return self._x
        @x.setter
        def x(self, value):
            self._x = value
        @x.deleter
        def x(self):
            del self._x
    """

重点在于:

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

和:

class C(object):
        @property
        def x(self):
            "I am the 'x' property."
            return self._x
        @x.setter
        def x(self, value):
            self._x = value
        @x.deleter
        def x(self):
            del self._x

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

应用于类属性

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

class Person(object):
    def __init__(self):
        self.__age = 18

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

    def del_age(self):
        del self.__age

    age = 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
    @property
    def age(self):
        return Person.__age

p=Person()
a=p.age
print(a)

18

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

class Person:
    def __init__(self):
        self.__age=18

    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        self.__age=value
    @age.deleter
    def age(self):
        del self.__age

p = 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

    @property
    def age(self):
        return self.__age
    @age.setter
    def age(self,value):
        self.__age=value
    @age.deleter
    def age(self):
        del self.__age

p = 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 = 18

    def get_age(self):
        return self.__age

    def set_age(self, value):
        self.__age = value

    def del_age(self):
        del self.__age

    age = 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] = value

p=Person()
p.age=20
print(p.age)
p.age=18
p.name='jaing'
print(p.__dict__)

在这里插入图片描述

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-08-19 19:00:11  更:2022-08-19 19:04:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 9:46:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码