zoukankan      html  css  js  c++  java
  • python 特性 property

                                                                          

    1 什么是特性property

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

    复制代码
     1 import math
     2 class Circle:
     3     def __init__(self,radius): #圆的半径radius
     4         self.radius=radius
     5 
     6     @property
     7     def area(self):
     8         return math.pi * self.radius**2 #计算面积
     9 
    10     @property
    11     def perimeter(self):
    12         return 2*math.pi*self.radius #计算周长
    13 
    14 c=Circle(10)
    15 print(c.radius)
    16 print(c.area) #可以向访问数据属性一样去访问area,会触发一个函数的执行,动态计算出一个值
    17 print(c.perimeter) #同上
    18 '''
    19 输出结果:
    20 314.1592653589793
    21 62.83185307179586
    22 '''
    复制代码

    注意:此时的特性arear和perimeter不能被赋值

    c.area=3 #为特性area赋值
    '''
    抛出异常:
    AttributeError: can't set attribute
    '''

    2 为什么要用property

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

    除此之外,看下

    复制代码
    ps:面向对象的封装有三种方式:
    【public】
    这种其实就是不封装,是对外公开的
    【protected】
    这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
    【private】
    这种封装对谁都不公开
    复制代码

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

    复制代码
     1 class Foo:
     2     def __init__(self,val):
     3         self.__NAME=val #将所有的数据属性都隐藏起来
     4 
     5     @property
     6     def name(self):
     7         return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
     8 
     9     @name.setter
    10     def name(self,value):
    11         if not isinstance(value,str):  #在设定值之前进行类型检查
    12             raise TypeError('%s must be str' %value)
    13         self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
    14 
    15     @name.deleter
    16     def name(self):
    17         raise TypeError('Can not delete')
    18 
    19 f=Foo('egon')
    20 print(f.name)
    21 # f.name=10 #抛出异常'TypeError: 10 must be str'
    22 del f.name #抛出异常'TypeError: Can not delete'
    复制代码
    复制代码
     1 class Foo:
     2     def __init__(self,val):
     3         self.__NAME=val #将所有的数据属性都隐藏起来
     4 
     5     def getname(self):
     6         return self.__NAME #obj.name访问的是self.__NAME(这也是真实值的存放位置)
     7 
     8     def setname(self,value):
     9         if not isinstance(value,str):  #在设定值之前进行类型检查
    10             raise TypeError('%s must be str' %value)
    11         self.__NAME=value #通过类型检查后,将值value存放到真实的位置self.__NAME
    12 
    13     def delname(self):
    14         raise TypeError('Can not delete')
    15 
    16     name=property(getname,setname,delname) #不如装饰器的方式清晰
    17 
    18 一种property的古老用法
    复制代码
  • 相关阅读:
    GRYZ20211029模拟赛解题报告
    LG 题解 CF1545B AquaMoon and Chess
    GRYZ10.27模拟赛解题报告
    开博客通告
    民科吧编程赛 题解
    民科吧编程赛 试题
    四则运算开平方——对民科吧编程大赛题目的再探究
    The First
    机械手相机9点坐标标定-基于C#+EmguCV
    Emgucv图像处理工具
  • 原文地址:https://www.cnblogs.com/lincappu/p/12566875.html
Copyright © 2011-2022 走看看