一、封装:

补充封装:

封装:
体现在两点:
1、数据的封装(将数据封装到对象中)
obj = Foo('宝宝',22)
2、封装方法和属性,将一类操作封装到一个类中
class Foo:
def __init__(self,name,age):
self.name = name
self.age = age
def show (self):
print(self.name,self.age)

什么是封装呢?(封装不是单纯意义的隐藏,其实它还是可以查看的)

  就是把一些不想让别人看的给隐藏起来了

封装数据:目的是保护隐私

功能封装:目的是隔离复杂度

如果用了私有的,在类的外部,无法直接使用变形的属性,但是在类的内部可以直接使用

 1.用我们常用的__init__方法里的self取值
class Course:#恰好给我们提供了实现这种思路的方法
# #一种思路,python
def __init__(self,price,period,name):
self.price = price
self.period = period
self.name = name
c = Course(2000,'linux','6 months')
print(c.period) 2.在类里面定义一个空字典,然后装在字典里面取值
def course(price,name ,period):
dic = {}
dic['price'] = price
dic ['name'] = name
dic ['period'] = period
return dic c = Course(2000,'python','6 months')
print(c.period) #对象名.属性名 查看属性的值 3.利用namedtuple方法
from collections import namedtuple #只有属性没有方法的类
Course = namedtuple('Course',['name','price','period']) #传两个参数,第一个为自定义的名字,第二个传进去的是属性
python = Course('python',10000,'6 moths') #相当于实例化了
print(python.name)

对象名.属性名取值的三种方法

2.封装类属性的私有属性(就是类属性前面加__)

 class Goods:
# 按照打八折计算 (定义了一个私有类属性)
__discount = 0.8 #变形后:_Goods__discount
def __init__(self,name,price):
self.name = name
self.price = price
def goods_price(self):
return self.price * Goods.__discount
apple = Goods('apple',10)
print(apple.goods_price())
# print(Goods.__dict__) #类名.__dict__
print(Goods._Goods__discount)

类属性1

 # 封装:把你不想让人看的隐藏起来
# 数据封装:目的保护隐私
class Teacher:
__School = 'oldboy' #类属性
def __init__(self,name,salary):
self.name = name
self .__salary = salary #_Teacher__salary
# 老师的属性 值
#怎么把薪水隐藏起来?
self.__salary=salary
def foo(self):
print('------') t=Teacher('egon',2000)
print(t.__dict__)
# print(t.name)
print(t._Teacher__salary)#让显示出来
print(Teacher._Teacher__School) #类属性使用_类名__属性名
t.foo()
#在本类内是可以正常调用的
#在本类外就必须以_类名__属性名调用(但是不建议你调)

类属性的私有方法

3.封装类对象的私有属性

成人的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 Person:
def __init__(self,height,weight,name,sex):
self.__height = height #私有属性(让你不再外面调它)
# 在本类中可以调用,在类外就不可以调用了
self.__weigth = weight
self.__name = name
self.__sex = sex
def tell_bmi(self): #体重指数
return self.__weigth/self.__height ** 2 #在本类中可以调用 def tell_height(self):
print(self.__height)
def tell_weight(self): #告诉体重
return self.__weigth
def set_weigth(self,new_weight): #修改体重
if new_weight >20:
self.__weigth = new_weight
else:
raise TypeError('你也太瘦了,瘦的连斤数都(快)没了') #如果体重小于20或者负的,就主动提示一个报错
egg = Person(1.6,96,'haiyan','female')
print(egg.tell_bmi())
# egg.__height #在类外不能调用
# print(egg._Person__height) #在类外查看得这样调用
print(egg.__dict__) #查看变形后的类型
# egg.set_weigth(-10)
# print(egg.tell_weigth())
egg.set_weigth(66) #修改体重为66
print(egg.tell_weight())

计算体质指数,衡量人健康的标准(对象的私有属性一)

 class People:
def __init__(self,name,age,sex,height):
self.__name = name
self.__age = age
self.__sex = sex
self.__height = height def tell_name(self): #看人名字
print(self.name)
def set_name(self,val): #修改名字
if not isinstance(val, str):
raise TypeError('名字必须是字符串类型')
self.__name = val
def tell_info(self):
print('''
---------%s info-----------
name:%s
age:%s
sex:%s
height:%s'''%(self.__name,self.__name,self.__age,self.__sex,self.__height)) p=People('egon',21,'male','')
p.tell_info()
p.set_name('haiyan') #调用修改名字的方法
p.tell_info()
# print(p._People__name)#就可以看到了

对象属性的私有属性二

4.封装类方法的私有属性

 # 方法的私有属性
class Parent:
def __init__(self):
self.__func() #__func==_Parent__func
def __func(self):
print('Parent func') class Son(Parent):
def __init__(self):
self.__func() #_Son__func
def __func(self):
print('Son func') def _Parent__func(self):
print('son _Parent__func')
s = Son()
print(Parent.__dict__) #类名.__dict__查看变形后的结果 # 私有属性:在本类内是可以正常调用的
# 在本类外就必须以_类名__属性名调用(但是不建议你调)

类方法的私有属性1

 class Foo:
def __func(self):
print('from foo')
class Bar(Foo):
def __func(self):
print('from bar')
b = Bar()
b._Foo__func()
b._Bar__func()

方法的私有属性2

 class Foo:
def __init__(self,height,weight):
self.height = height
self.weight = weight
def __heightpow(self): #私有方法
return self.height * self.height
def tell_bmi(self):
return self.weight/self.__heightpow() egon = Foo(1.7,120)
print(egon.tell_bmi())
print(Foo.__dict__)
print(egon._Foo__heightpow()) #虽说是私有的,但是还是可以查看的

装饰方法的私有属性3

5.property

为什么要用property:将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问的原则

1.计算圆的面积和周长

 from math import pi
class Circle:
def __init__(self,radius):
self.radius = radius
@property #装饰器:把一个方法当成一个属性用了
def area(self):
return self.radius * self.radius* pi
@property
def peimeter(self):
return 2*pi*self.radius c = Circle(10)
print(c.area) #当成一个属性来调了,就不用加括号了
print(c.peimeter)

property

2.缓存网页信息

 from urllib.request import urlopen
class Web_page:
def __init__(self,url):
self.url = url
self.__content = None #内容设置为None
@property
def content(self):
if self.__content: #如果不为空,就说明已经下载了 _Web_page__content
return self.__content
else:
self.__content = urlopen(self.url).read()#做缓存
return self.__content
mypage = Web_page('http://www.baidu.com')
print(mypage.content)
print(mypage.content)
print(mypage.content)

property(2)

3.求和,平均值,最大值,最小值

 class Num:
def __init__(self,*args):
print(args)
if len(args)==1 and (type(args[0]) is list or type(args[0]) is tuple):
self.numbers=args[0]
else:
self.numbers = args @property
def sum(self):
return sum(self.numbers) @property
def avg(self):
return self.sum/len(self.numbers) @property
def min(self):
return min(self.numbers) @property
def max(self):
return max(self.numbers)
num = Num([3,1,3])
vvv = Num(8,2,3)
print(num.sum)
print(num.min)
print(num.avg)
print(num.max)
print('-----------')
print(vvv.sum)
print(vvv.min)
print(vvv.avg)
print(vvv.max)

property(3)

6.setter

 class Goods:
__discount = 0.8 #类的私有属性
def __init__(self,name,price):
self.name = name
self.__price = price @property
def price(self):
# if hasattr(self,'__price'):
return self.__price * Goods.__discount
# else:
# raise NameError @price.setter
def price(self,new_price):
if type(new_price) is int:
self.__price = new_price @price.deleter
def price(self):
del self.__price apple = Goods('apple',10)
# print(apple.price)
apple.price = 20
print(apple.price) # del apple.price
# print(apple.price)
# apple.set_price(20)
# apple._Goods__apple

买东西

@property把一个类中的方法 伪装成属性
原来是obj.func()
现在是obj.func -->属性
1.因为属性不能被修改
所以用了@funcname.setter
obj.func = new_value 调用的是被@funcname.setter装饰器装饰的方法
被@property装饰的方法名必须和被@funcname.setter装饰的方法同名
2.也可以另一种方法修改,但是上一种方法吧一个类中的方法伪装成属性来调用了,而这种方法
还是原来实例化一样调用
例如:
 class People:
def __init__(self,name,age,sex,height):
self.__name = name
self.__age = age
self.__sex = sex
self.__height = height def tell_name(self): #看人名字
print(self.name)
def set_name(self,val): #修改名字
if not isinstance(val, str):
raise TypeError('名字必须是字符串类型')
self.__name = val
def tell_info(self):
print('''
---------%s info-----------
name:%s
age:%s
sex:%s
height:%s'''%(self.__name,self.__name,self.__age,self.__sex,self.__height)) p=People('egon',21,'male','')
p.tell_info()
p.set_name('haiyan') #调用修改名字的方法
p.tell_info()
# print(p._People__name)#就可以看到了

												

python之--------封装的更多相关文章

  1. 将Python脚本封装成exe可执行文件 转

    将Python脚本封装成exe可执行文件 http://www.cnblogs.com/renzo/archive/2012/01/01/2309260.html  cx_freeze是用来将 Pyt ...

  2. python继承——封装

    python继承--封装 1 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度 2 封装分为两个层面 第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空 ...

  3. 【转】Python基础-封装与扩展、静态方法和类方法

    [转]Python基础-封装与扩展.静态方法和类方法 一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数 ...

  4. python 3 封装

    python 3 封装 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小鱼,小虾,小王八,一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的. 先看如何隐藏 在 ...

  5. python面向对象-封装-property-接口-抽象-鸭子类型-03

    封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...

  6. python学习笔记:安装boost python库以及使用boost.python库封装

    学习是一个累积的过程.在这个过程中,我们不仅要学习新的知识,还需要将以前学到的知识进行回顾总结. 前面讲述了Python使用ctypes直接调用动态库和使用Python的C语言API封装C函数, C+ ...

  7. python文件封装成*.exe

    python文件封装成*.exe文件(单文件和多文件) 环境:win10 64位 python3.7 原文: https://www.cnblogs.com/jackzz/p/9431923.html ...

  8. 第7.9节 案例详解:Python类封装

    上节介绍了Python中类的封装机制,本节结合一个具体例子进行详细说明. 我们定义一个Person类,其内部有姓名.年龄和类型三个实例变量,并定义了相关的存取方法: class Person():   ...

  9. python面向对象(封装,继承,多态)

    python面向对象(封装,继承,多态) 学习完本篇,你将会深入掌握 如何封装一个优雅的借口 python是如何实现继承 python的多态 封装 含义: 1.把对象的属性和方法结合成一个独立的单位, ...

  10. 利用PyInstaller将python代码封装成EXE(亲测可用)

    有些不能成功,有些不全的,下面总结一下,给自己以后看看.   1下载PyInstaller..去官网下载http://www.pyinstaller.org/(我下载的版本)   2不需要安装,解压即 ...

随机推荐

  1. 分享一个废弃已久的插件架构 (.Net)

    框架介绍 1:将插件暴露的页面数据接口复用到任何 WebForm和Mvc 架构的系统. 2:插件可在线卸载,发布,更新. 3:插件可分布式 独立 部署. 4:插件之间完全解耦,通过Url跳转 相互不需 ...

  2. MySQL5.7使用过程中遇到的问题

    Q1.MySQL无法启动服务,启动服务时提示:"本地计算机 上的 MySQL 服务启动后停止.某些服务在未由其他服务或程序使用时将自动停止." PS.解压缩的MySQL安装过程也可 ...

  3. Python爬虫番外篇之Cookie和Session

    关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解 什么 ...

  4. 认识cpu、核与线程

    作为一个后台开发人员,我想有必要了解这些基础知识.如果本文有不严谨或者疏忽的地方,请指正. cpu与核心 物理核 物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数 虚拟核 所谓的4核 ...

  5. RxSwift 实战操作【注册登录】

    前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是C ...

  6. SVN分支/合并操作小记

    一.前言 说来惭愧,鄙人从事开发多年,使用svn已经好几个年头了,但是却仅限于update.commit.compare之类的操作,最近想到github上学习别人写的NIO源码,顺便去熟悉git的使用 ...

  7. HDU - 3697 Selecting courses

    题目链接:https://vjudge.net/problem/HDU-3697 题目大意:选课,给出每门课可以的选课时间.自开始选课开始每过五分钟可以选一门课,开始 时间必须小于等于四,问最多可以选 ...

  8. Objective-C NSFileManager的使用 各种文件操作

    所有方法 都很简单,大概记录一下,写文件并没有是追加的方式而是简单的覆盖 //创建文件夹 - (BOOL)creatDir:(NSString*)newDirName at:(NSString*)di ...

  9. LeetCode-Interleaving String[dp]

    Interleaving String Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Fo ...

  10. HDOJ2000-ASCII码排序

    Problem Description 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符.   Input 输入数据有多组,每组占一行,有三个字符组成,之间无空格.   Output ...