python之--------封装

一、封装:

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

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

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

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

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

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

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

2.类属性的私有属性

 1 class Goods:
 2     # 按照打八折计算 (定义了一个私有类属性)
 3     __discount = 0.8  #变形后:_Goods__discount
 4     def __init__(self,name,price):
 5         self.name = name
 6         self.price = price
 7     def goods_price(self):
 8         return  self.price * Goods.__discount
 9 apple = Goods(‘apple‘,10)
10 print(apple.goods_price())
11 # print(Goods.__dict__)  #类名.__dict__
12 print(Goods._Goods__discount)

类属性1

 1 # 封装:把你不想让人看的隐藏起来
 2 # 数据封装:目的保护隐私
 3 class Teacher:
 4     __School = ‘oldboy‘  #类属性
 5     def __init__(self,name,salary):
 6         self.name = name
 7         self .__salary  =  salary  #_Teacher__salary
 8             # 老师的属性   值
 9         #怎么把薪水隐藏起来?
10         self.__salary=salary
11     def foo(self):
12         print(‘------‘)
13
14 t=Teacher(‘egon‘,2000)
15 print(t.__dict__)
16 # print(t.name)
17 print(t._Teacher__salary)#让显示出来
18 print(Teacher._Teacher__School)  #类属性使用_类名__属性名
19 t.foo()
20 #在本类内是可以正常调用的
21 #在本类外就必须以_类名__属性名调用(但是不建议你调)

类属性的私有方法

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

如上面的指标来计算下你自己的体质指数

 1 class Person:
 2     def __init__(self,height,weight,name,sex):
 3         self.__height = height  #私有属性(让你不再外面调它)
 4                                 # 在本类中可以调用,在类外就不可以调用了
 5         self.__weigth = weight
 6         self.__name = name
 7         self.__sex = sex
 8     def tell_bmi(self):  #体重指数
 9         return self.__weigth/self.__height ** 2  #在本类中可以调用
10
11     def tell_height(self):
12         print(self.__height)
13     def tell_weight(self):  #告诉体重
14         return  self.__weigth
15     def set_weigth(self,new_weight):   #修改体重
16         if new_weight >20:
17              self.__weigth = new_weight
18         else:
19             raise TypeError(‘你也太瘦了,瘦的连斤数都(快)没了‘)   #如果体重小于20或者负的,就主动提示一个报错
20 egg = Person(1.6,96,‘haiyan‘,‘female‘)
21 print(egg.tell_bmi())
22 # egg.__height #在类外不能调用
23 # print(egg._Person__height)  #在类外查看得这样调用
24 print(egg.__dict__)  #查看变形后的类型
25 # egg.set_weigth(-10)
26 # print(egg.tell_weigth())
27 egg.set_weigth(66)  #修改体重为66
28 print(egg.tell_weight())

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

 1 class People:
 2     def __init__(self,name,age,sex,height):
 3         self.__name = name
 4         self.__age = age
 5         self.__sex = sex
 6         self.__height = height
 7
 8     def tell_name(self):  #看人名字
 9         print(self.name)
10     def set_name(self,val): #修改名字
11         if not isinstance(val, str):
12             raise TypeError(‘名字必须是字符串类型‘)
13         self.__name = val
14     def tell_info(self):
15          print(‘‘‘
16            ---------%s info-----------
17            name:%s
18            age:%s
19            sex:%s
20            height:%s‘‘‘%(self.__name,self.__name,self.__age,self.__sex,self.__height))
21
22 p=People(‘egon‘,21,‘male‘,‘180‘)
23 p.tell_info()
24 p.set_name(‘haiyan‘)   #调用修改名字的方法
25 p.tell_info()
26 # print(p._People__name)#就可以看到了

对象属性的私有属性二

4.类方法的私有属性

 1 # 方法的私有属性
 2 class Parent:
 3     def __init__(self):
 4         self.__func()  #__func==_Parent__func
 5     def __func(self):
 6         print(‘Parent func‘)
 7
 8 class Son(Parent):
 9     def __init__(self):
10         self.__func()  #_Son__func
11     def __func(self):
12         print(‘Son func‘)
13
14     def _Parent__func(self):
15         print(‘son _Parent__func‘)
16 s = Son()
17 print(Parent.__dict__)  #类名.__dict__查看变形后的结果
18
19 # 私有属性:在本类内是可以正常调用的
20 #           在本类外就必须以_类名__属性名调用(但是不建议你调)

类方法的私有属性1

1 class Foo:
2     def __func(self):
3         print(‘from foo‘)
4 class Bar(Foo):
5     def __func(self):
6         print(‘from bar‘)
7 b = Bar()
8 b._Foo__func()
9 b._Bar__func()

方法的私有属性2

 1 class Foo:
 2     def __init__(self,height,weight):
 3         self.height = height
 4         self.weight = weight
 5     def __heightpow(self):  #私有方法
 6         return self.height * self.height
 7     def tell_bmi(self):
 8         return self.weight/self.__heightpow()
 9
10 egon = Foo(1.7,120)
11 print(egon.tell_bmi())
12 print(Foo.__dict__)
13 print(egon._Foo__heightpow())  #虽说是私有的,但是还是可以查看的

装饰方法的私有属性3

5.property

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

1.计算圆的面积和周长

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

property

2.缓存网页信息

 1 from urllib.request import urlopen
 2 class Web_page:
 3     def __init__(self,url):
 4         self.url = url
 5         self.__content = None  #内容设置为None
 6     @property
 7     def content(self):
 8         if self.__content:  #如果不为空,就说明已经下载了  _Web_page__content
 9             return self.__content
10         else:
11             self.__content = urlopen(self.url).read()#做缓存
12             return self.__content
13 mypage = Web_page(‘http://www.baidu.com‘)
14 print(mypage.content)
15 print(mypage.content)
16 print(mypage.content)

property(2)

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

 1 class Num:
 2     def __init__(self,*args):
 3         print(args)
 4         if len(args)==1 and (type(args[0]) is list or type(args[0]) is tuple):
 5             self.numbers=args[0]
 6         else:
 7             self.numbers = args
 8
 9     @property
10     def sum(self):
11         return sum(self.numbers)
12
13     @property
14     def avg(self):
15         return self.sum/len(self.numbers)
16
17     @property
18     def min(self):
19         return min(self.numbers)
20
21     @property
22     def max(self):
23         return max(self.numbers)
24 num = Num([3,1,3])
25 vvv = Num(8,2,3)
26 print(num.sum)
27 print(num.min)
28 print(num.avg)
29 print(num.max)
30 print(‘-----------‘)
31 print(vvv.sum)
32 print(vvv.min)
33 print(vvv.avg)
34 print(vvv.max)

property(3)

6.setter

 1 class Goods:
 2     __discount = 0.8  #类的私有属性
 3     def __init__(self,name,price):
 4         self.name = name
 5         self.__price = price
 6
 7     @property
 8     def price(self):
 9         # if hasattr(self,‘__price‘):
10             return self.__price * Goods.__discount
11         # else:
12         #     raise NameError
13
14     @price.setter
15     def price(self,new_price):
16         if type(new_price) is int:
17             self.__price = new_price
18
19     @price.deleter
20     def price(self):
21         del self.__price
22
23 apple = Goods(‘apple‘,10)
24 # print(apple.price)
25 apple.price = 20
26 print(apple.price)
27
28 # del apple.price
29 # print(apple.price)
30 # apple.set_price(20)
31 # apple._Goods__apple

买东西

@property把一个类中的方法 伪装成属性原来是obj.func()现在是obj.func  -->属性1.因为属性不能被修改所以用了@funcname.setter
obj.func = new_value 调用的是被@funcname.setter装饰器装饰的方法被@property装饰的方法名必须和被@funcname.setter装饰的方法同名2.也可以另一种方法修改,但是上一种方法吧一个类中的方法伪装成属性来调用了,而这种方法还是原来实例化一样调用例如:

 1 class People:
 2     def __init__(self,name,age,sex,height):
 3         self.__name = name
 4         self.__age = age
 5         self.__sex = sex
 6         self.__height = height
 7
 8     def tell_name(self):  #看人名字
 9         print(self.name)
10     def set_name(self,val): #修改名字
11         if not isinstance(val, str):
12             raise TypeError(‘名字必须是字符串类型‘)
13         self.__name = val
14     def tell_info(self):
15          print(‘‘‘
16            ---------%s info-----------
17            name:%s
18            age:%s
19            sex:%s
20            height:%s‘‘‘%(self.__name,self.__name,self.__age,self.__sex,self.__height))
21
22 p=People(‘egon‘,21,‘male‘,‘180‘)
23 p.tell_info()
24 p.set_name(‘haiyan‘)   #调用修改名字的方法
25 p.tell_info()
26 # print(p._People__name)#就可以看到了


				
时间: 2024-10-02 18:06:02

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

python 3 封装

python 3 封装 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小鱼,小虾,小王八,一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装='隐藏',这种理解是相当片面的. 先看如何隐藏 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) 其实这仅仅这是一种变形操作 类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A: __N=0 #类的数据属性就应该是共享的,但是语法上是可以把类的数据属性设置成私有的如__N,会变形为_A__N d

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

将Python脚本封装成exe可执行文件 http://www.cnblogs.com/renzo/archive/2012/01/01/2309260.html cx_freeze是用来将 Python 脚本封装成可执行程序的工具,支持最新的Python3.2版本.生成的执行文件具有跨平台性,而且运行的系统无须安装Python.目前类似功能的工具还有py2exe 和 PyInstaller,其中貌似py2exe知名度最高了,但是很久没有更新了,至于打包质量不做评价,毕竟萝卜青菜各有所爱:PyI

Python基础-封装与扩展、静态方法和类方法

一.封装与扩展 封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用者的代码:而外部使用者只知道一个接口(函数),只要接口(函数)名.参数不变,使用者的代码永远无需改变.这就提供一个良好的合作基础--或者说,只要接口这个基础约定不变,则代码改变不足为虑. 实例: 1 #类的设计者 2 class Room: 3 def __init__(self,name,owner,width,length,high): 4 self.name=name 5 self.owner=owner

python基础----封装

从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数据的封装) 你的性取向(数据的封装) 你撒尿的具体功能是怎么实现的(方法的封装) 为什么要封装 封装数据的主要原因是:保护隐私(作为男人的你,脸上就写着:我喜欢男人,你害怕么?) 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你不必

python的封装与解构

封装 将多个值使用逗号分割,组合在一起 本质上,返回一个元祖,只是省掉了小括号 python特有语法,被很多语言学习和借鉴 t1 = (1,2) #定义为元祖 t2 = 1,2 #将1和2封装成元祖 print(type(t1)) print(type(t2)) 返回类型都为元组: <class 'tuple'> <class 'tuple'> 使用方法: a = 4 b = 5 temp = a a = b b = temp # 等价于 a,b = b,a #等号右边使用了封装,

Python的封装、继承和多态

数据封装.继承和多态是面向对象的三大特点. 数据封装: 在某个类中,比如Student类(初始化又name和score两个属性),每个实例都拥有各自的name,score这些数据.我们可以通过函数来访问这些数据,比如打印一个学生的成绩.直接定义一个输出函数,输出name和对应的score即可. 但是,既然student实例本身就有这些数据,要访问这些数据,就没有必要从外面的函数去访问,可以直接在Student类的内部定义访问数据的函数,这样,就把"数据"给封装起来了,这些封装数据的函数

python 属性封装

120 1 #封装 2 3 class Person: 4 def __init__(self,name,passwd): 5 self.name=name 6 self.__passwd=passwd 7 8 def get_pwd(self): 9 return self.__passwd 10 11 Jack=Person("Jack","abc123") 12 13 print(Jack._Person__passwd) 14 print(Jack.get_

python文件封装成可执行exe文件

最近写了一个小小的程序,需要进行封装exe,下面就给大家介绍一下如何用pyinstaller去封装程序为exe程序. 首先,需要安装一下pip这个应用,这个已经在前面的文章中说过了,windows和linux都有请借鉴windows和linux. 第二步,安装好pip之后,在cmd命令窗口中输入pip install pyinstaller即能安装上pyinstaller,那么接下来要介绍一下关于pyinstaller几个指令了:-w指令直接发布的exe应用带命令行调试窗口,在指令内加入-w命令

Python面向对象封装案例

01. 封装 封装 是面向对象编程的一大特点 面向对象编程的 第一步 —— 将 属性 和 方法 封装 到一个抽象的 类 中 外界 使用 类 创建 对象,然后 让对象调用方法 对象方法的细节 都被 封装 在 类的内部 02. 小明爱跑步 需求 小明 体重 75.0 公斤 小明每次 跑步 会减肥 0.5 公斤 小明每次 吃东西 体重增加 1 公斤 注意: 在 对象的方法内部,是可以 直接访问对象的属性 的! class Person: def __init__(self,name,weight):