案例:

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

繁:

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. Android CoordinatorLayout、AppBarLayout、DrawerLayout、NavigationView 的使用及问题小结

    这里只对Material Design中这几种组件使用的重要部分以及容易出现问题的地方进行汇总(遇坑请直接看最后常见问题部分),详细用法请自行查阅官方文档 一.CoordinatorLayout 介绍 ...

  2. adb 获取Android手机信息命令(1)

    @set version=1.7.2Normal @echo ============================================================= @echo I ...

  3. GBK,UNICODE,GB2312,UTF-8学习总结

    转自http://www.cnblogs.com/pannengzhi/p/5678495.html UNICODE,GBK,UTF-8区别 前言 其实这是个老生常谈的问题了,相信大家在第一次遇到Un ...

  4. 【线段树】BZOJ2752: [HAOI2012]高速公路(road)

    2752: [HAOI2012]高速公路(road) Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1621  Solved: 627[Submit] ...

  5. 如何删除chrome地址栏里面曾经输错的地址

    在chrome浏览器的地址栏输入你想删除的网址的部分字幕,比如,在地址栏输入form,然后用键盘上的方向键定位到你想删除的那个错误的地址,如下图所示   然后在键盘上按 shift+del 组合键将其 ...

  6. JavaScript获取当前url路径

    1.假设当前页完整地址是:http://localhost:61768/Home/Index?id=2 //获取当前窗口的Url var url = window.location.href; //结 ...

  7. 云计算之路-阿里云上:docker swarm 集群故障与异常

    在上次遭遇 docker swarm 集群故障后,我们将 docker 由 17.10.0-ce 升级为最新稳定版 docker 17.12.0-ce . 前天晚上22:00之后集群中的2个节点突然出 ...

  8. 微信app支付(android端+java后台)

    本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...

  9. 【请您听我说】PHP语法特点的一些看法

    一.基本认识 PHP是干什么的?百度百科上提到说:PHP就是一门脚本语言,开发用的,相信这个你们只要去搜一下,就会有一大堆关于PHP概念的解释. 相信我们对PHP的初步认识是从浏览器开始的吧,当我们每 ...

  10. CTF---Web入门第十一题 PHP大法

    PHP大法分值:20 来源: DUTCTF 难度:中 参与人数:8205人 Get Flag:2923人 答题人数:3042人 解题通过率:96% 注意备份文件 解题链接: http://ctf5.s ...