ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

Python装饰器之property

2022-05-03 16:01:55  阅读:185  来源: 互联网

标签:name area Python self property 装饰 def 属性


我们一直在用“类对象.属性”的方式访问类中定义的属性,其实这种做法是欠妥的,因为它破坏了类的封装原则。正常情况下,类包含的属性应该是隐藏的,只允许通过类提供的方法来间接实现对类属性的访问和操作。

操作类属性

在不破坏类封装原则的基础上,为了能够有效操作类中的属性,类中应包含读(或写)类属性的多个 getter(或 setter)方法,这样就可以通过“类对象.方法(参数)”的方式操作属性

class Student:
    def __init__(self, name):
        self.name = name

    def set_name(self, name):
        self.name = name

    def get_name(self):
        return self.name

    def del_name(self):
        self.name = "xxx"

student = Student("Python")
print(student.get_name())
student.set_name("Java")
print(student.get_name())
student.del_name()
print(student.get_name())

### 运行结果
Python
Java
xxx

property() 函数

上面这种操作类属性的方式比较麻烦,我们更习惯于使用“类对象.属性”这种方式,Python 中提供了 property() 函数,可以实现在不破坏类封装原则的前提下,让开发者依旧使用“类对象.属性”的方式操作类中的属性。

property() 函数的基本使用格式如下:

属性名 = property(fget=None, fset=None, fdel=None, doc=None)
在使用 property() 函数时,以上 4 个参数可以仅指定第 1 个、或者前 2 个、或者前 3 个,当前也可以全部指定。也就是说,property() 函数中参数的指定并不是完全随意的。
想要有写和删的权限必须要有读的权限,否则报错
name = property(getname)    # name 属性可读,不可写,也不能删除
name = property(getname, setname) # name属性有读、写的权限,但是不能删除
name = property(getname, setname,delname)    #name属性可读、可写、也可删除,就是没有说明文档

class Students:
    def __init__(self, name):
        self.__name = name

    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def del_name(self):
        self.__name = "xxx"

    # 为name 属性配置 property() 函数
    name = property(get_name, set_name, del_name, '指明出处')


# 调取说明文档的 2 种方式
print(Students.name.__doc__)
help(Students.name)

student = Students("C语言")
print(student.name)

student.name = "Python教程"
print(student.name)

del student.name
print(student.name)

### 运行结果
指明出处
Help on property:

    指明出处

C语言
Python教程
xxx

注意,在此程序中,由于 getname() 方法中需要返回 name 属性,如果使用 self.name 的话,其本身又被调用 getname(),这将会先入无限死循环。为了避免这种情况的出现,程序中的 name 属性必须设置为私有属性,即使用 __name(前面有 2 个下划线)。

property装饰器用法

class Rect:
    def __init__(self, area):
        self.__area = area

    @property  # 只读权限
    def area(self):
        return self.__area

    @area.setter # 拥有读写权限,前提是上面一定有property(要用只读),否则报错
    def area(self, value):
        self.__area = value

    @area.deleter  # 拥有删除权限,前提是上面一定有property(要用只读),否则报错
    def area(self):
        del self.__area


rect = Rect(30)
print("初始化的area值是:", rect.area)
rect.area = 90
print("修改后的area值是:", rect.area)
del rect.area
print("删除后的area值是:", rect.area)

### 运行结果:
初始化的area值是: 30
修改后的area值是: 90
Traceback (most recent call last):
  File "tests.py", line 60, in <module>
    print("删除后的area值是:", rect.area)
  File "tests.py", line 44, in area
    return self.__area
AttributeError: 'Rect' object has no attribute '_Rect__area'

标签:name,area,Python,self,property,装饰,def,属性
来源: https://www.cnblogs.com/bigcarcar/p/16218539.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有