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. Entity Framework 6.X实现记录执行的SQL功能

    Entity Framework在使用时,很多时间操纵的是Model,并没有写sql语句,有时候为了调试或优化等,又需要追踪Entity framework自动生成的sql(最好还能记录起来,方便出错 ...

  2. npm run dev时报错“events.js:160 throw er; // Unhandled 'error' event”

    经查,此问题由端口占用导致,node服务器默认端口8080已被其他程序占用,关闭占用端口的程序或者修改node服务器的默认端口即可解决此问题

  3. 生成器(generator),迭代器(yield)

    g=(i for i in range(10)) #小括号表示生成一个迭代生成器.[]是列表生成器 g.__next__() yield将一个函数变成生成器 import time def f(): ...

  4. Mitigate XSS attacks

    JavaScriptEncode //使用“\”对特殊字符进行转义,除数字字母之外,小于127使用16进制“\xHH”的方式进行编码,大于用unicode(非常严格模式). var JavaScrip ...

  5. 【Excel】SUMIF的错位问题

    具体情况是这样的: 如图,我们需要求得“一车间”的“发生额总计”,所以我们选择使用SUMIF函数 如果是这样填写函数参数的话,那你的计算结果就会有问题 就会出现下图这样的情况,“发生额总计”为34.8 ...

  6. zabbix日常监控项mysql(七)

    参考文档: percona官方文档:https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html za ...

  7. print in或者not in, 判断在不在里面

    print("不疼" in "麻花疼")        # 结果False print("不疼"in "真不疼") # ...

  8. System.Data.DbType与各类数据库的数据类型的映射关系

    有如下类型的映射对照: System.Data.SqlClient.SqlDbType System.Data.OleDb.OleDbType System.Data.Odbc.OdbcType Sy ...

  9. JedisPool无法获得资源问题

    线上碰到一个问题:redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the ...

  10. [AHOI2009]飞行棋

    嘟嘟嘟 刚开始想这道题的时候确实很蒙,只想到矩形对边做对应的弧长相等,然后想办法凑出相等的弧长.其实正解很简单,不要去想边,应该想对角线,因为根据初中园的知识,这个矩形的对角线是圆的直径,而直径所对的 ...