类的封装

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

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

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

  • 封装分为两个层面

      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. Sencha Touch中 xclass和xtype区别

    1.xclass 就是 Ext.create(xclass) 和 xtype一样的性质,不一定非要是自己创建的. 2.xtype是xclass的简称. 3.使用xtype前,你要new的对象,先要re ...

  2. 络谷 P2865 [USACO06NOV]路障Roadblocks

    P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...

  3. What you can talk

    data buffer who locked the account hash join cost memory and nested loop do not. How to make it hash ...

  4. Android中@+id和@id的差别

    Android中的组件须要用一个int类型的值来表示.这个值也就是组件标签中的id属性值. id属性仅仅能接受资源类型的值,也就是必须以@开头的值,比如,@id/abc.@+id/xyz等.  假设在 ...

  5. h5 播放器 -3

    autoplay <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  6. 一篇文章贯穿ACE各种发送接收组件 1.2版

    TCP通信过程介绍 首先介绍一下socket通信的基本过程:这里先如果有两个家伙在通信,一个是S.还有一个叫C (1)S打开port监听本地的port看看有没有人来连接: (2)与此同一时候C试图去连 ...

  7. Oracle数据库软件标准版的一个限制:仅仅能用一个rman channel

    Oracle数据库软件标准版的一个限制:仅仅能用一个rman channel Restrictions in "Standard Edition" Rman channel all ...

  8. Android HAL模块实现

    1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的.是为了避开linux的GPL束缚. 思路是把控制硬件的动 ...

  9. 批量梯度下降(Batch gradient descent) C++

    At each step the weight vector is moved in the direction of the greatest rate of decrease of the err ...

  10. 单向链表的归并排序——java实现

    在做Coursera上的Algorithms第三周测验练习的时候有一道链表随机排序问题,刚开始没有什么思路,就想着先把单向链表归并排序实现了,再此基础上进行随机排序的改造.于是就结合归并排序算法,实现 ...