zoukankan      html  css  js  c++  java
  • 如何创建可管理的对象属性?

    需求:
    在面向对象的编程中,我们把方法(函数)看作对象的接口,直接访问对象的属性可能是不安全的,或设计上不够灵活。但是使用调用方法在形式上不如访问属性简洁。
    circle.getRadius()
    circle.setRadius(5.0) # 繁

    circle.radius
    circle.radius = 5.0 # 简

    能否在形式上是属性的访问,但是实际调用方法?

    思路:
    使用property函数为类创建可管理属性,fget/fset/fdel对相应属性访问

    代码:

    from math import pi
    
    class Circle(object):
        def __init__(self,radius):
            self.radius = radius
    
        def getRadius(self):
            return self.radius
    
        def setRadius(self,value):
            if not isinstance(value,(int,float)):
                raise ValueError('wrong type')
            self.radius = float(value)
    
        def getArea(self):
            return self.radius ** 2 * pi
    
        R = property(getRadius, setRadius) # 第一个参数为c.R的时候调用的方法,第二个参数为c.R=xxx时调用的方法
    
    c = Circle(3.2)
    print(c.R)
    c.R = 'abc'
    print(c.R)
    
    ==================================================================
    
    import math
    class Circle:
        def __init__(self,radius):
            self.radius = radius
    
        def get_radius(self):
            return round(self.radius,2)
    
        def set_radius(self,radius):
            if not isinstance(radius,(int,float)):
                raise TypeEror('woring type')
            self.radius = radius
    
        @property
        def S(self):
            return self.radius ** 2 * math.pi
    
        @S.setter
        def S(self,s):
            self.radius = math.sqrt(s / math.pi)
    
        R = property(get_radius,set_radius)
    
    c = Circle(5.712)
    c.S = 99.88
    print(c.S)
    print(c.R)
    
    #c.R = 100.987
    #print(c.R * 2)
    # c.radius = '31.98'
    #c.set_radius('31.38')
    #d = c.radius * 2
    #print(c.get_radius())
    
    
  • 相关阅读:
    Android Permission 访问权限大全(转)
    .NET中DateTime.Now.ToString的格式化字符串
    linux
    code only
    常用JavaScript操作页面元素的方法
    C#将字符串数组转换为以逗号分隔的字符串
    C#去除数组空格
    追源索骥:透过源码看懂Flink核心框架的执行流程
    高并发请求的缓存设计策略
    spark 2.3 导致driver OOM的一个SparkPlanGraphWrapper源码的bug
  • 原文地址:https://www.cnblogs.com/Richardo-M-Q/p/13363434.html
Copyright © 2011-2022 走看看