码迷,mamicode.com
首页 > 编程语言 > 详细

python_如何创建可管理的对象属性

时间:2017-08-05 00:04:43      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:blog   font   logs   ros   wrong   如何   setter   round   val   

案例:

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

       繁:

              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_如何创建可管理的对象属性

标签:blog   font   logs   ros   wrong   如何   setter   round   val   

原文地址:http://www.cnblogs.com/2bjiujiu/p/7287406.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!