1、特性(property)

什么是特性property

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

  

例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)

  成人的BMI数值:

  过轻:低于18.5

  正常:18.5-23.9

  过重:24-27

  肥胖:28-32

  非常肥胖, 高于32

  体质指数(BMI)=体重(kg)÷身高^2(m)

  EX:70kg÷(1.75×1.75)=22.86

  (1)添加属性

class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height p = People('alex', 60, 1.80)
p.bmi = p.weight / (p.height ** 2)
print(p.bmi)
18.51851851851852

  

(2)通过方法返回

class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height def bmi(self):
return self.weight / (self.height ** 2) p = People('alex', 60, 1.80)
# p.bmi = p.weight / (p.height ** 2)
# print(p.bmi) # 属性 print(p.bmi()) # 方法

  (3)方法当做属性调用

class People:
def __init__(self, name, weight, height):
self.name = name
self.weight = weight
self.height = height @property
def bmi(self):
return self.weight / (self.height ** 2) p = People('alex', 60, 1.80)
# p.bmi = p.weight / (p.height ** 2)
# print(p.bmi) # 属性 # print(p.bmi()) # 方法 print(p.bmi) # 类的特征方法转换为类的数据属性,调用的时候
p.bmi = 3333 # 不能赋值,不是真的数据属性

2、为什么要用property

class People:
def __init__(self, name):
self.__name = name @property
def name(self):
return self.__name p = People('alex') print(p.name) # 数据属性 p.name = 'ALEX'

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

除此之外,看下

ps:面向对象的封装有三种方式:
【public】
这种其实就是不封装,是对外公开的
【protected】
这种封装方式对外不公开,但对朋友(friend)或者子类(形象的说法是“儿子”,但我不知道为什么大家 不说“女儿”,就像“parent”本来是“父母”的意思,但中文都是叫“父类”)公开
【private】
这种封装对谁都不公开
  python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现

  

class People:
def __init__(self, name):
self.__name = name @property
def name(self):
return self.__name @name.setter
def name(self, name):
if not isinstance(name, str):
print('名字必须是字符串类型')
return
self.__name = name @name.deleter
def name(self):
print('不允许删除') p = People('alex')
print(p.name) # property 数据属性 p.name = 14 # name.setter 修改的时候,限定
p.name = 'jack'
print(p.name) del p.name # name.deleter 删除的时候,限定

  

6 [面向对象]-property的更多相关文章

  1. 面向对象property属性、静态方法和类方法

    一.property属性 1.什么是property特性? property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值. from math import pi class Circl ...

  2. 面向对象——property

    1.property特性 property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉到name是执行了一 ...

  3. Python面向对象-@property装饰器

    python中,我们可以直接添加和修改属性的值: >>> class Student(object): ... pass ... >>> s = Student() ...

  4. 面向对象 - 封装/property - 总结

    面向对象 - 封装: 封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo 1.特点: 1.在类外部无法直接访问 _ ...

  5. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

  6. python 3全栈开发-面向对象之绑定方法(classmethod与staticmethod的区别)、多态、封装的特性property

    一.面向对象绑定方法 一.类中定义的函数分成两大类 1.绑定方法(绑定给谁,谁来调用就自动将它本身当作第一个参数传入): 1. 绑定到类的方法:用classmethod装饰器装饰的方法. 为类量身定制 ...

  7. 面向对象【林老师版】:特性(property)(十六)

    一.什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成 ...

  8. 面向对象的封装(私有化)及@property(查看)/@setter(修改)!!!

    面向对象有三大特性,继承,多态,封装继承可以减少代码重复量,多态可以用多继承模仿别的语言的建立规则约束子类封装为类的属性/方法的私有化,可以限制别人看,读,修改的权限,目前理解做记录,日后温习,回顾, ...

  9. 面向对象中的property装饰器讲解

    面向对象中可以用property来修饰我们的函数,必须下面的例子 class Test(object): def __init__(self,name): self.name = name @prop ...

随机推荐

  1. OpenGLES渲染

    OpenGLES渲染 OpenGLES使用GPU渲染图片,不占用CPU,但其使用还是挺复杂的. 先用OpenGLES显示一张图片: // // ShowViewController.m // Open ...

  2. linux在当前目录下根据文件名查找文件

    grep -rl "python" ./ 查找./目录下文件名中包含python的文件 find | grep luoluo将当前目录下(包括子目录)的文件名中含有luoluo的文 ...

  3. python3: 字符串和文本(2)

    6. 字符串忽略大小写的搜索替换 >>> text = 'UPPER PYTHON, lower python, Mixed Python' >>> re.find ...

  4. Hadoop HA 高可用集群的搭建

    hadoop部署服务器 系统 主机名 IP centos6.9 hadoop01 192.168.72.21 centos6.9 hadoop02 192.168.72.22 centos6.9 ha ...

  5. 谈谈 C++ 中的右值引用

    转自:https://liam0205.me/2016/12/11/rvalue-reference-in-Cpp/ 最近在改 XGBoost 的代码.XGBoost 在代码中使用了很多来自 C++1 ...

  6. [MongoDB]------windos远程服务器部署连接

    1.连接前的准备 这里就省略了服务器上安装的操作,跟上一节是一样的流程. 连接到远程服务器,首先需要到远程服务器上在mongoDb安装根目录下的bin文件夹(默认安装目录是C:\Program Fil ...

  7. tomcat6 集群配置

    1. 概要 web容器在做集群配置时,有3点需要注意: 1.1. 负载均衡配置: 1.2. session共享: 1.3. 若做的是单机集群(多个tomcat安装在同一台机器上),需要注意端口冲突问题 ...

  8. 【CF662C】Binary Table

    题目 好吧,我连板子都不会了 有一个非常显然的做法就是\(O(2^nm)\)做法就是枚举每一行的状态,之后我们贪心去看看每一列是否需要翻转就好啦 显然这个做法非常垃圾过不去 首先我们发现每一列都不超过 ...

  9. centos 6.8安装java环境

    1.rpm -qa |grep java   查看当前是否有java已经安装了,部分centos系统已经安装了的openjava环境,但是很多项目不熟要求的是要必须是sun的java环境 2.yum ...

  10. 包学会之浅入浅出Vue.js:结业篇

    在第一篇<包学会之浅入浅出Vue.js:开学篇>和上一篇<包学会之浅入浅出Vue.js:升学篇>的学习中,我们首先了解了Vue环境的搭建以及两个重要思想——路由和组件的学习,通 ...