类的封装

  • 封装:把一些属性,方法打包封装在一个对象中。

  • 对属性封装:保护隐私,类内部的属性不想让其他人访问

  • 对方法封装:对外隐藏内部具体的实现细节,外部只要根据内部提供的接口去用就可以了。

  • 封装分为两个层面

      1. 对象能拿到类的东西,但类能拿到对象的东西吗?
    class Foo:
x = 1 f = Foo()
print(f.x) # 1 对象可以获取类中的属性 f.y = 2 # 这里就是对对象进行了封装
print(Foo.y)
    1. 内部可以使用,但是外部不可以使用(在需要封装的属性前加上__
class People():
__love_people = 'haha'
print(__love_people) # 内部可以使用 def __zuofan(self):
print('做饭') def __xiwan(self):
print('洗碗') def chifan(self):
self.__zuofan()
self.__xiwan() f = People()
# print(f.__love_people) # 报错,获取不到 f.chifan()
```

内部 haha

做饭

洗碗

```

应用场景:

class People:
def __init__(self, pwd):
self.__pwd = pwd # 不想让别人获取密码 @property
def pwd(self): # 加一个伪装
return '无法获取密码' f = People(123)
print(f.pwd)
无法获取密码

如果真的要拿

  • Python 的私有并不是真的私有,是一种称为name mangling 的改名策略

    • 可以使用object._classname__attributename访问
    • 也就是对象名._类名__属性名
class Foo:
def f1(self):
print('Foo.f1') def f2(self):
print('Foo.f2')
self.f1() # b.f1() class Bar(Foo):
def f1(self):
print('Bar.f1') b = Bar()
b.f2()
Foo.f2
Bar.f1
class Foo:
def __f1(self):
print('Foo.f1') def f2(self):
print('Foo.f2')
self.__f1() # b._Foo__f1() class Bar(Foo):
def __f1(self):
print('Bar.f1') b = Bar()
b.f2()
Foo.f2
Foo.f1
  • 封装其实在定义阶段就已经执行了,会把私有属性__f1变成_Foo__f1,之后都不会做这种处理
class Foo:
__count = 0 f = Foo()
f.__y = 1 # 这样只是定义了一个变量名叫__y,而不是把他变成了私有属性
print(f.__y) # 所以可以运行使用
1

类的property特性

  • property一般用在类中写的是方法,但他应该按照属性来调用的时候,来进行使用。
  • property让函数方法变成属性
  • 举例:BMI
class People:

    def __init__(self, height, weight):
self.height = height
self.weight = weight @property # 装饰器,下面方法的调用无需加()
def bmi(self):
return self.weight/(self.height**2) peo = People(1.76, 62.5)
# print(peo.bmi())
print(peo.bmi)

setter & deleter

  • 装饰器用法,只在Python3中使用
  • @bmi.setter和@bmi.deleter让这个函数方法bmi()可以像属性一样进行修改和删除
  • 在修改或者删除的时候自动触发,运行下面方法的代码,不会执行原有的修改或者删除
class People:
def __init__(self, height, weight):
self.height = height
self.weight = weight @property # 装饰器,下面方法的调用无需加()
def bmi(self):
return self.weight/(self.height**2) @bmi.setter # 在修改bmi的时候出发,必须得加参数
def bmi(self, value): # 函数名不能改,否则报错
print('你正在修改bmi') @bmi.deleter # 在删除bmi的时候触发,不能加参数
def bmi(self):
print('你正在删除bmi') peo = People(1.76, 62.5)
print(peo.bmi) peo.bmi = 21
del peo.bmi print(peo.bmi)
20.176911157024794
你正在修改bmi
你正在删除bmi
20.176911157024794

类属性用法

类与对象的绑定方法和非绑定方法

对象方法&类方法&静态方法

class Foo:
# 对象方法不用加任何装饰
def f1(self): # 绑定给对象,实例对象使用的时候会自动传入self中,类也能用,但是需要传参
print('对象方法') @classmethod # 让被装饰的方法函数给类使用
def f2(cls): # 绑定给类,类对象使用的时候会自动传入cls中,对象也能用,但是传入的依旧是类
print('类方法') @staticmethod # 被装饰的方法函数变成非绑定的
def f3(): # 生命都没绑定,也不会自动传参,就是正常的普通函数,类和对象都能用
print('静态方法')

隐藏模块内的函数

  • 在想要隐藏的函数前加上 _即可,使用from module import *** 的时候无法导入,真要导入就from module impor _函数**(这样做没有意义)

封装的三个等级(课外了解)

  • 封装的三个级别:

    • 公开:public
    • 受保护的:protected
    • 私有的:private
    • 注意:public, protected, private 不是关键字,只是有概念
  • 判别对象的位置

    • 对象外部
    • 对象内部
    • 子类中
  • 私有的 private

    • 私有成员是最高级别的封装,只能在当前类或对象中访问
    • 在成员前面添加两个下划线即可
      • class Person():

        • name = "lingmei"

          • # name是共有成员
        • __age = 17
          • __age 是私有成员
    • Python 的私有并不是真的私有,是一种称为name mangling 的改名策略
      • 可以使用object._classname__attributename访问
      • 也就是对象名._类名__属性名
  • 受保护的封装 protected

    • 受保护的封装是将对象成员进行一定级别的封装,在类中或者子类中都可以进行访问,但在外部不可以

      • 类似于半私有半共有
    • 封装方法:在成员名称前面加一个下划线即可
  • 公开的、公共的 public

    • 公共的封装并没有对成员有什么操作
    • 任何地方都可以访问

day36 类的三大特性---封装以及Property特性的更多相关文章

  1. 类的封装,property特性,类与对象的绑定方法和非绑定方法,

    类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...

  2. Python面向对象之封装、property特性、绑定方法与非绑定方法

    一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...

  3. 封装、property特性及绑定与非绑定方法

    1.封装 (1)什么是封装? 封:属性对外是隐藏的,但对内是开放的: 装:申请一个名称空间,往里面装入一系列名字/属性 (2)为什么要封装? 封装数据属性的目的 首先定义属性的目的就是为了给类外部的使 ...

  4. day22-类的封装、property特性以及绑定方法与非绑定方法

    目录 类的封装 两个层面的封装 第一个层面 第二个层面 封装的好处 私有模块 类的propertry特性 setter 和 deleter 类与对象的绑定方法与非绑定方法 类的封装 将类的属性或方法隐 ...

  5. python面向编程:类的组合、封装、property装饰器、多态

    一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 ...

  6. (转载)OC学习篇之---类的三大特性:封装,继承,多态

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用,今天来继续学习OC中的类的三大特性,我们在学习Java的时候都知道,类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今 ...

  7. 面向对象三大特性——封装(含property)

    一.封装概念 封装是面向对象的特征之一,是对象和类概念的主要特性. 封装就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 二.隐藏属性 在p ...

  8. 转 OC温故:类的三大特性(封装,继承,多态)

    原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...

  9. OC学习篇之---类的三大特性(封装,继承,多态)

    之前的一片文章介绍了OC中类的初始化方法和点语法的使用:http://blog.csdn.net/jiangwei0910410003/article/details/41683873,今天来继续学习 ...

随机推荐

  1. DSP广告系统架构及关键技术解析(转)

    广告和网络游戏是互联网企业主要的盈利模式 广告是广告主通过媒体以尽可能低成本的方式与用户达成接触的商业行为.也就是说按照某种市场意图接触相应人群,影响其中潜在用户,使其选择广告主产品的几率增加,或对广 ...

  2. MRO 方法解释顺序

    MRO是用在多重继承中的.考虑这种情况,整个环境中父类是两个 P1,P2 子类是两个 C1,C2 而 孙子类是G1. 我们知道 G1会从 P1,P2,C1,C2中继承属性,但是如果有多个属性重名,那么 ...

  3. log_archive_dest_1设置报错

    DG搭建完之后,又报错: Tue Dec 22 16:24:33 2015 Errors in file /u01/app/oracle/admin/orcl/bdump/orcl_arc1_2994 ...

  4. GDUT Krito的讨伐(bfs&&优先队列)

    题意 Description Krito最终干掉了99层的boss,来到了第100层. 第100层能够表示成一颗树.这棵树有n个节点(编号从0到n-1),树上每个节点可能有非常多仅仅怪物. Krito ...

  5. java面向接口编程

    在oop中有一种设计原则是面向接口编程,面向接口编程有非常多优点,详细百度一大片.我来谈一下详细的使用中的一些不成熟的见解.! 首先面向接口编程能够消除类之间的依赖关系,使得业务仅仅依赖接口. 这样有 ...

  6. js中DOMContentLoaded和load的区别

    如题:DOMContentLoaded和load都是页面加载的时候触发的事件.区别在于触发的时机不一样. 浏览器渲染页面DOM文档加载的步骤: 1.解析HTML结构. 2.加载外部脚本和css文件. ...

  7. Android 实现文字与图片的混排

    在我们的项目中,常常会碰到图片与文字混排的问题.解决这类问题的方法有非常多,本文给出的方法不是唯一的.仅仅有依据实际场景才干找到更适合的方法. 本文主要通过xml布局来实现图片与文字的混排(水平排列) ...

  8. Codeforces Round #332 (Div. 2)D. Spongebob and Squares 数学

    D. Spongebob and Squares   Spongebob is already tired trying to reason his weird actions and calcula ...

  9. golomb哥伦布编码——本质上就是通过0来区分商和余数

    哥伦布编码是一个针对整数的变长编码方式,详细介绍可以看维基百科.这里简单介绍下: 哥伦布编码使用指定的整数 M 把输入的整数分成两部分:商数 q.余数 r. 商数当做一元编码,而余数放在后面做为可缩短 ...

  10. heap堆&&priority_queue优先队列

    堆(heap)不是stl中的东西...它分为 max heap 和min heap. 但我不想用这些,而是采用了priority_queue,优先队列,定义在queue中.顾名思义,它的作用就是无论怎 ...