zoukankan      html  css  js  c++  java
  • python之property属性

    Property的概念:property是一种特殊的属性,访问它时会执行一段功能(函数),然后返回值。

    import math
    
    class Circle:
    
        def __init__(self,radius):#园的半径radius
    
            self.radius=radius
    
        @property#area=property(area)
    
        def area(self):
    
            return math.pi*self.radius**2#计算面积
    
        @property
    
        def perimeter(self):
    
            return 2*math.pi*self.radius#计算周长
    
     
    
    c=Circle(5)
    
    print(c.radius)
    
    # print(c.area())
    
    # print(c.perimeter())
    
    print(c.area)#函数前添加装饰器后,调用时不加括号就可以运行
    
    print(c.perimeter)
    

      

    为什么要用property

    将一个类的函数定义成特性以后,对象再去使用的时候obj,name根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

    除此之外:

    面向对象的封装有三种方式:

    【public】

    这种其实就是不封装,是对外公开的

    【protected】

    这种封装方式对外不公开,但对朋友或者子类公开

    【private】
    这种封装对谁都不公开

    Python并没有在语法上把他们三个内建到自己的CLASS机制中,在C++里一般会将所有的数据设置为私有的,然后提供set和get方法去设置和获取,在Python中通过property方法可以实现

    class Foo:
    
        def __init__(self,val):
    
            self.__NAME=val #将所有的数据属性都隐藏起来
    
     
    
        @property
    
        def name(self):
    
            return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
    
     
    
        @name.setter
    
        def name(self,value):
    
            if not isinstance(value,str):  #在设定值之前进行类型检查
    
                raise TypeError('%s must be str' %value)
    
            self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
    
     
    
        @name.deleter
    
        def name(self):
    
            raise TypeError('Can not delete')
    
     
    
    f=Foo('egon')
    
    print(f.name)
    
    # f.name=10 #抛出异常'TypeError: 10 must be str'
    
    del f.name #抛出异常'TypeError: Can not delete'
    

      

  • 相关阅读:
    I NEED A OFFER!
    水题 Codeforces Round #303 (Div. 2) A. Toy Cars
    模拟 HDOJ 5099 Comparison of Android versions
    模拟 HDOJ 5095 Linearization of the kernel functions in SVM
    贪心 HDOJ 5090 Game with Pearls
    Kruskal HDOJ 1863 畅通工程
    Kruskal HDOJ 1233 还是畅通工程
    并查集 HDOJ 1232 畅通工程
    DFS/并查集 Codeforces Round #286 (Div. 2) B
    水题 Codeforces Round #286 (Div. 2) A Mr. Kitayuta's Gift
  • 原文地址:https://www.cnblogs.com/asaka/p/6758487.html
Copyright © 2011-2022 走看看