本站消息

  本站每日ip已达10000,出租广告位,位置价格可谈,需要合作请联系站长


+关注
已关注

分类  

标签  

set(0)

三元运算符(0)

装饰器(0)

函数(0)

列表(0)

日期归档  

2019-02(1)

2019-03(1)

2019-04(1)

2019-06(2)

2019-07(4)

从零开始的Python学习Episode 20——面向对象(3)

发布于2019-08-07 16:54     阅读(159)     评论(0)     点赞(1)     收藏(4)


面向对象之封装

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体。

 

隐藏

在python中用双下划线开头的方式将属性隐藏起来(设置成私有的)

class A:
    __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N
    def __init__(self):
        self.__X=10 #变形为self._A__X
    def __foo(self): #变形为_A__foo
        print('from A')
    def bar(self):
        self.__foo() #只有在类内部才可以通过__foo的形式访问到.
#在类的外部像__X=1和__foo()这样调用是不正确的

但是,这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,如a._A__N,即这种操作并不是严格意义上的限制外部访问,仅仅只是一种语法意义上的变形,主要用来限制外部的直接访问。

 

特性(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
 
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)

p1=People('pup',53,1.70)
print(p1.bmi)
#输出18.339100346020764

这种特性是不能被修改赋值的,否则会报错。



所属网站分类: 技术文章 > 博客

作者:慧雅

链接: https://www.pythonheidong.com/blog/article/11867/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

1 0
收藏该文
已收藏

评论内容:(最多支持255个字符)