案例:

在面向对象编程中,我们把方法作为对象的接口,自己访问对象的属性可能是不安全的,或设计上不灵活,但是使用调用方法在形式上不如访问属性简洁

繁:

circle.getRadius()

circle.setRadius(5.0)

#!/usr/bin/python3

from math import pi

class Circle():
    def __init__(self, radius):
        self.radius = radius

    # 获取半径接口
    def get_radius(self):
        return self.radius

    # 设置半径接口
    def set_radius(self, value):
        if isinstance(value, (int, float)):
            self.radius = float(value)
        else:
            raise ValueError('wrong type')

    # 获取面积接口
    def get_area(self):
        return round(self.radius ** 2 * pi, 2)

if __name__ == '__main__':
    c = Circle(3.0)
    print(c.get_area())

    # 设置半径
    c.set_radius(5.0)
    print(c.get_radius(), c.get_area())

简:

circle.radius

circle.radius = 5.0

第二种方式看起来更加舒服简洁,如何实现?

如何实现?

  1. 通过类装饰器property,把类方法,变成类似属性一样

    # !/usr/bin/python3
    
    from math import pi
    
    class Circle():
        def __init__(self, radius):
            self.radius = radius
    
        # 获取半径
        @property
        def get_radius(self):
            return self.radius
    
        # 获取面积
        @property
        def get_area(self):
            return round(self.radius ** 2 * pi, 2)
    
        # 设置半径值,指明为get_area函数设置值,但是给哪个函数设置值无关紧要,只要是类属性,其他函数都可以访问
        @get_area.setter
        def set_radius(self, value):
            if isinstance(value, (int, float)):
                self.radius = float(value)
            else:
                raise ValueError('wrong type')
    
    if __name__ == '__main__':
        c = Circle(3.0)
        print(c.get_area)
    
        c.set_radius = 5.0
        print(c.get_radius, c.get_area)
    

      

  2. 通过内置property方法
    # !/usr/bin/python3
    
    from math import pi
    
    class Circle():
        def __init__(self, radius):
            self.radius = radius
    
        # 获取半径
        def get_radius(self):
            return self.radius
    
        # 获取面积
        def get_area(self):
            return round(self.radius ** 2 * pi, 2)
    
        # 设置半径值,
        def set_radius(self, value):
            if isinstance(value, (int, float)):
                self.radius = float(value)
            else:
                raise ValueError('wrong type')
    
        # obj.R 调用第一个函数,obj = 5.0 调用第二个函数,进行设置值,没有@property灵活
        R = property(get_radius, set_radius)
    
    if __name__ == '__main__':
        c = Circle(3.0)
        print(c.get_area())
    
        c.R = 5.0
        print(c.R)
        print(c.R, c.get_area())

python_如何创建可管理的对象属性的更多相关文章

  1. python类与对象-如何创建可管理的对象属性

    如何创建可管理的对象属性 问题举例 在面向对象编程中, 我们把方法看作对象的接口, 直接访问对象的属性可能是不安全的,或设计上不够灵活. 但是使用调用方法在形式上不如访问属性简洁. circle.ge ...

  2. Greenplum+Hadoop学习笔记-14-定义数据库对象之创建与管理模式

    6.3.创建与管理模式 概述:DB内组织对象的一种逻辑结构.一个DB内能够有多个模式.在未指定模式时默认放置在public中.能够通过"\dn"方式查看数据库中现有模式: test ...

  3. Oracle02——oracle分页、子查询、集合运算、处理数据、创建和管理表和其他数据库对象

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7289451.html --oracle分页(Pageing Query) select ...

  4. python对象属性管理(2):property管理属性

    使用Property管理属性 python提供了一种友好的getter.setter.deleter类方法的属性管理工具:property. property()是一个内置函数,它返回一个Proper ...

  5. 3、ObjectARX开发创建直线、圆、圆弧和修改对象属性

    一.本节课程 Arx二次开发创建直线.圆.圆弧和修改对象属性 二.本节要讲解的知识点 1.如何应用C++ ARX二次开发创建直线. 2.如何应用C++ ARX二次开发创建圆. 3.如何应用C++ AR ...

  6. Greenplum中定义数据库对象之创建与管理模式

    创建与管理模式 概述:DB内组织对象的一种逻辑结构.一个DB内能够有多个模式.在未指定模式时默认放置在public中.能够通过"\dn"方式查看数据库中现有模式. testdw=# ...

  7. python并发编程02 /多进程、进程的创建、进程PID、join方法、进程对象属性、守护进程

    python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 目录 python并发编程02 /多进程.进程的创建.进程PID.join方法.进程对象属性.守护进程 ...

  8. Spring框架context的注解管理方法之二 使用注解注入基本类型和对象属性 注解annotation和配置文件混合使用(半注解)

    首先还是xml的配置文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

  9. 【转】使用PowerDesigner的建模创建升级管理数据库

    使用PowerDesigner的建模创建升级管理数据库 PowerDesigner是一种著名的CASE建摸工具,最开始为数据库建模设计,即物理模型(Physical Data Model)用于生成数据 ...

随机推荐

  1. python之 模块与包

    一. 模块 1.模块定义: 将代码量较大的程序分割成多个有组织的.彼此独立但又能互相交互的代码片段,这些自我包含的有组织的代码段就是模块. 2.模块分类: a.标准库(又称内置模块) b.开源模块(又 ...

  2. css中的相对定位与绝对定位

    之前说过了CSS有三种基本的布局机制:普通流.浮动和绝对定位.除非专门指定,否则所有的框都在普通流中定位.而普通流中元素框的位置由元素在HTML中的位置决定. 相对定位 相对定位实际上被看做普通流定位 ...

  3. DAY6-小变化(java提示框)-2018-1-16

    终于有一点点小变化了,今天学习了java里的对话框,有四种类型:1.确认对话框(showConfirmDialog) 2.可选择输入的对话框(showInputDialog) 3.信息对话框(show ...

  4. Zabbix实战-简易教程--正则(Regxp)

    一.正则表达式(Regx) 1.概述 正则表达式概念就不解释了.请参考:https://en.wikipedia.org/wiki/Regular_expression#POSIX_extended ...

  5. 【转】JavaWeb编码之get方式中文乱码问题

    一.现象描述 以get方式提交含中文表单,后台接收为乱码: <form action="admin/User/searchUser.do" method="get& ...

  6. ESLint 使用入门 - 来自推酷

    在团队协作中,为避免低级 Bug.产出风格统一的代码,会预先制定编码规范.使用 Lint 工具和代码风格检测工具,则可以辅助编码规范执行,有效控制代码质量. 在以前的项目中,我们选择 JSHint 和 ...

  7. JavaSE(四)之接口、访问控制

    上面我们学习了几个修饰符,在开发中经常会用的到,所以必须熟练的掌握.接下来我学习一下接口和访问控制. 一.接口 一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方 ...

  8. vijos 1213:80人环游世界

    描述 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么一个80人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. ...

  9. UVa 11461 - Square Numbers【数学,暴力】

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  10. [bzoj4410] [Usaco2016 Feb]Fence in

    根据ccz181078大爷的题解可得(QAQ,每次肯定是断掉连续一行||一列的栅栏... 贪心地想,一个格子与外面联通,显然是先把短的边界断掉(就像mst那样 但是比较蛋疼的是,因为我们每次断的时候, ...