一、封装:

补充封装:

封装:
体现在两点:
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. RabbitMQ插件安装

    RabbitMQ的有些插件没有集成在初始的安装中,它们需要额外安装,这些文件的后缀为.ez,安装时需要将.ez文件拷贝到安装的插件目录.以下是不同系统中默认安装的插件目录路径: 插件目录 Linux ...

  2. Java中引用的浅复制和深复制

    Java中除了基本类型int,char,double等的赋值是按照值传递之外,其余的类型和对象都是按照引用进行传递的. 下面来看一个关于引用的例子. package referenceCopy;// ...

  3. MySQL慢查询日志

    实验环境: OS X EI Captian + MySQL 5.7 一.配置MySQL自动记录慢查询日志 查看变量,也就是配置信息 show (global) variables like '%slo ...

  4. Css绘制形状

    前言:终于我的大一生活结束了,迎来了愉快的暑假,大家都开始了各自的忙碌.一直忙着一些项目的事情,终于决定今天要更新一篇博客了,对上一阶段的学习做简单的总结. 这次我主要总结一下用Css绘制各种形状的技 ...

  5. SSH中的Invalid action class configuration that references an unknown class named.......

    最近用SSH框架做项目的时候页面提交数据到后台,遇到了这个问题,百度了一下,网上的解决办法无非两种: 1.检查struts.xml  ,applicationContext.xml的配置是否正确 2. ...

  6. for(int a:i)在java 编程中的使用

    这种有冒号的for循环叫做foreach循环,foreach语句是java5的新特征之一,在遍历数组.集合方面,foreach为开发人员提供了极大的方便. foreach语句是for语句的特殊简化版本 ...

  7. 解决React Native unable to load script from assets index.android.bundle on windows

    React Native运行的时候,经常碰到React Native unable to load script from assets index.android.bundle on windows ...

  8. CSS外边距合并问题

    今天无意中碰到了外边距合并的问题,于是便研究了一下.这里做个笔记. 所谓外边距合并,指的是当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者. ...

  9. Protobuf动态解析在Java中的应用 包含例子程序

    最近在做ProtoBuf相关的项目,其中用到了动态解析,网上看了下相关资料和博文都比较少,自己来写一个记录一下学习过程.   Protocol Buffers是结构化数据格式标准,提供序列化和反序列方 ...

  10. SQL Server2008 安装及概述

    最近在学习SQL Server 数据库,用的版本是2008 R2的版本,如下图所示,本人学习时间不长,写这篇文章一是为了锻炼自己加深印象,二也可以与和诸多朋友进行交流以及得到大家的指教. 安装教程网上 ...