面向对象编程之封装

封装

定义:将属性和方法一股脑的封装到对象中,使对象可通过“对象.”的方式获取或存储数据。

作用:让对象有了"."的机制,存取数据更加方便

  1. # 定义类,调用类创建对象,这个过程可理解为封装
  2. class Teacher:
  3. def __init__(self, name, age, gender):
  4. self.name = name
  5. self.age = age
  6. self.gender = gender
  7. def score(self):
  8. print(f"{self.name}老师正在修改分数……")
  9. tea = Teacher("lee", 27, "男")
  10. print(tea.name, tea.age, tea.gender)
  11. tea.score()

访问限制机制

定义:凡是在类内部定义的属性或方法,以__开头的,都会被限制,外部不能直接访问

这种机制看起来像是将属性和方法隐藏起来了,__开头的属性或方法,等价于 _类名__属性_类名__方法()

作用:将隐私数据,隐藏起来,不让外部轻易获取。

与其他编程语言的区别:

其他语言就是私有化,限制访问。但在python中,仅仅是隐藏,这是python独有的特性

  1. class Person:
  2. __name = "lee"
  3. __age = 18
  4. __gender = "男"
  5. def __init__(self, name, age, gender):
  6. self.__name = name
  7. self.__age = age
  8. self.__gender = gender
  9. def __userinfo(self):
  10. print(f"姓名:{self.__name},年龄:{self.__age},性别:{self.__gender}")
  11. person = Person("dawn", 27, "男")
  12. print(person.__name) # 输出报错 AttributeError: 'Person' object has no attribute '__name'
  13. person.__userinfo() # 输出报错 AttributeError: 'Person' object has no attribute '__userinfo'
  14. # 被__修饰的属性或者方法,可以通过 _类名__属性或_类名__方法名() 来访问
  15. print(person._Person__name) # 输出结果:dawn
  16. person._Person__userinfo() # 输出结果:姓名:dawn,年龄:27,性别:男

__修饰的属性和方法,只能在当前类中使用

  1. class A:
  2. def __fa(self): # 4._A_fa()
  3. print('from A') # 5.最终输出的是就是 from A
  4. def test(self): # 2.test(b) 虽然这里传入的是对象b
  5. self.__fa() # 3.但是因为类的访问限制机制,这里强制换成成了 _A__fa()
  6. class B(A):
  7. def __fa(self): # _B__fa()
  8. print('from B')
  9. b = B()
  10. b.test() # 1.对象b 和当前子类B 中都没有 test(),所以去父类A中查找

输出结果

  1. from A

property

定义: python内置的装饰器,用于将对象.方法()调整成对象.方法,类似获取属性的方式调用方法。

作用:在某些情况下,方法返回的仅仅是处理后的数据。为了让调用者更方便的使用,将方法的调用方式修改成了类似属性的调用方式。

  1. class User:
  2. def __init__(self, weight, height):
  3. self.weight = weight
  4. self.height = height
  5. @property
  6. def bmi(self):
  7. return self.weight / (self.height ** 2)
  8. # 创建user对象
  9. user_obj = User(46, 1.56)
  10. # bmi()方法使用了property装饰器,调用的时候,不加()
  11. print(user_obj.bmi) # 输出结果:18.902038132807363
  12. # 调用时,加了(),相当于user_obj.bmi()()
  13. print(user_obj.bmi()) # 报错 TypeError: 'float' object is not callable

加了property装饰器后,调用者很容易将方法当作属性去修改或者删除.但是方法是不能通过对象.去修改删除的。

为了让调用者可以像处理属性一样的去修改或者删除,python提供了@被装饰方法名.setter来修改方法,@被装饰方法名.delter来删除方法

  1. class User:
  2. def __init__(self, weight, height):
  3. # self.name = name
  4. self.weight = weight
  5. self.height = height
  6. self.__getbmi = self.weight / (self.height ** 2)
  7. @property # 对象.bmi() ----→ 对象.bmi
  8. def bmi(self):
  9. return self.__getbmi
  10. @bmi.setter # 允许修改 对象.bmi()中的值
  11. def bmi(self, value):
  12. self.__getbmi = value
  13. @bmi.deleter # 允许删除 对象.bmi()中的值
  14. def bmi(self):
  15. del self.__getbmi
  16. # 创建user对象
  17. user_obj = User(46, 1.56)
  18. # print(user_obj.bmi()) # 报错,user_obj.bmi() ----→ user_obj.bmi()()
  19. print(user_obj.bmi) # 输出结果:18.902038132807363
  20. user_obj.bmi = 18 # 修改bmi 的值。
  21. print(user_obj.bmi) # 输出结果:18
  22. del user_obj.bmi # 删除bmi
  23. print(user_obj.bmi) # 报错,bmi 被删除了

python基础-面向对象编程之封装、访问限制机制和property的更多相关文章

  1. python基础-面向对象编程之继承

    面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...

  2. python基础-面向对象编程之反射

    面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...

  3. python基础-面向对象编程之多态

    面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...

  4. python基础-面向对象编程之组合

    面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...

  5. Python基础教程之udp和tcp协议介绍

    Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...

  6. 面向对象——组合、封装、访问限制机制、property内置装饰器

    面向对象--组合.封装.访问限制机制.property 组合 什么是组合? 组合指的是一个对象中,包含另一个或多个对象 为什么要组合? 减少代码的冗余 怎么用组合? # 综合实现 # 父类 class ...

  7. Python基础教程之List对象 转

    Python基础教程之List对象 时间:2014-01-19    来源:服务器之家    投稿:root   1.PyListObject对象typedef struct {    PyObjec ...

  8. Python 面向对象编程之封装的艺术

    1. 面向对象编程 OOP ( Object  Oriented Programming) 即面向对象编程. 面向对象编程是一种编码思想,或是一种代码组织方式.如同编辑文章时,可以选择分段.分节的方式 ...

  9. java学习笔记(基础篇)—面向对象编程之封装、继承、多态

    一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...

随机推荐

  1. Distinct 实现自定义去重

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. SpringBoot学习(二)探究Springboot启动机制

    引言: SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起探究一下SpringBoot的启动原 ...

  3. Spring MVC(2)Spring MVC 组件开发

    一.控制器接收各类请求参数 代码测试环境: 接收各类参数的控制器--ParamsController package com.ssm.chapter15.controller; @Controller ...

  4. Java基础(三十二)JDBC(2)连接数据库

    一.连接数据库的过程 连接数据库的过程:加载数据库驱动程序,不过只需在第一次访问数据库时加载一次,然后在每次访问数据库时创建一个Connection实例,然后执行操作数据库的SQL语句,并返回执行结果 ...

  5. day3-02 python入门之基本的数据类型

    目录 一.整型(int) 二.浮点型(float) 三.字符串类型(str) 字符串在python2和python3中的细微区别 四.复数 五.列表(list) 六.数据字典(dict) 定义方式 七 ...

  6. (二)django--带APP的网站

    1.打开终端,进入到django项目,创建APP应用:python manage.py startapp news 2.在settings.py中进行注册 3.在news下新建views.py,和ur ...

  7. todoList.html

    待做的事情 {{item}} 完成 <!DOCTYPE html> <html> <head> <meta charset="UTF-8" ...

  8. vue表单和组件使用

    表单: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  9. SpringBoot与MybatisPlus3.X整合之通用枚举(十二)

    一 通用枚举 解决了繁琐的配置,让 mybatis 优雅的使用枚举属性! 自3.1.0开始,可配置默认枚举处理类来省略扫描通用枚举配置 默认枚举配置 升级说明: 3.1.0 以下版本改变了原生默认行为 ...

  10. arango集群部署

    arango集群部署 ############arango集群操作################## arangodb3-3.3.16-1.x86_64.rpm(使用rpm包方式安装) arango ...