封装

封装:主要是指在类的定义阶段将,以__开头的属性名进行变形.。例如:__name ==> _People__name

封装的主要特点

1.在类外部无法直接__name,想要在外部调用可以使用_People__name
2.在类内部可以直接使用__name
3.子类无法覆盖父类__开头的属性

解释特点3的例子:

class Foo:
def __func(self): # _Foo_func
print('from foo') class Bar(Foo):
def __func(self): # _Bar_func
print('form bar') b = Bar()
b.func()

由上可以看出函数属性名在经过变形之后,子类与父类的函数名不相同,所以子类无法覆盖父类__开头的属性

封装的时候应注意的问题

1.所谓的隐藏并不是真正的隐藏,可以通过_People__name来获取

2.想要隐藏属性,就要在类的定义阶段进行隐藏,只发生一次

3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的

解释问题一的例子

class B:
__x = 1 print(_B__x)

解释问题二的例子

class B:
__x = 1 def __init__(self,name):
self.__name = name B.__y = 2
print(B.__dict__)
print(B.__y)

第一次打印的是:

{'__module__': '__main__', '_B__x': 1, '__init__': <function B.__init__ at 0x000002412D07BA60>, '__dict__': <attribute '__dict__' of 'B' objects>, '__weakref__': <attribute '__weakref__' of 'B' objects>, '__doc__': None, '__y': 2}

由此可以看出想要隐藏属性,只能在类定义的时候进行隐藏

解释问题三的例子

class A:
def __foo(self): # _A__foo
print('A.foo') def bar(self):
print('A.bar')
self.__foo() #self._A_foo() class B(A):
def __foo(self): # _B__foo
print('B.foo') b = B()
b.bar()

封装的意义

封装数据属性的意义:明确区分内外,控制外部对的隐藏属性的操作行为

class People:
def __init__(self,name,age):
self.__name = name
self.__age = age def tell_info(self):
print('Name:<%s> Age:<%s>'%(self.__name,self.__age)) def set_info(self,name,age):
if not isinstance(name,str):
print("名字必须是字符串类型")
return
if not isinstance(age,int):
print("年龄必须是整数类型") self.__name = name
self.__age = age p = People('yang',18)
# p.tell_info() p.set_info('',19)
p.tell_info()

封装函数属性的意义 :隔离复杂度

#二、封装方法,隔离复杂度
class ATM:
def __card(self):
print('插卡')
def __auth(self):
print('用户认证')
def __input(self):
print('输入取款金额')
def __print_bill(self):
print('打印 账单')
def __take_money(self):
print('取款') def withdraw(self):
self.__card()
self.__auth()
self.__input()
self.__print_bill()
self.__take_money() print(ATM.__dict__)
a=ATM()
a.withdraw()

property: 

@property 主要是将将函数属性伪装成数据属性,是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值

  • @property     查看 必须要有返回值   print(p.name)  name 是函数属性 不是数据属性 伪装成 数据属性
  • @name.setter  修改                 p.name='alex'
  • @name.deleter 删除                 del p.name

总结:通过计算得来的方法 可以通过@property 伪装成数据属性

'''
例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)
成人的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 People:
def __init__(self,name,height,weight):
self.name = name
self.weight = weight
self.height = height @property
def bmi(self):
return self.weight / (self.height ** 2) p = People('yang',1.78,61)
print(p.bmi)
# p.bmi = 33 #报错 class People:
def __init__(self,name):
self.__name = name @property
def name(self):
# print('getter')
return self.__name @name.setter
def name(self,val):
# print('setter')
if not isinstance(val,str):
print('名字必须是字符串类型')
return
self.__name = val @name.deleter
def name(self):
print("不可以被删除") p = People('egon')
# print(p.get_name()) # p.name = 'EGON'
# print(p.name)
del p.name

封装||property的更多相关文章

  1. Python10/24--组合/封装/property装饰器/多态

    组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...

  2. python 全栈开发,Day22(封装,property,classmethod,staticmethod)

    一.封装 封装 : 广义上的 :把一堆东西装在一个容器里 狭义上的 :会对一种现象起一个专门属于它的名字 函数和属性装到了一个非全局的命名空间 —— 封装 隐藏对象的属性和实现细节,仅对外提供公共访问 ...

  3. python基础学习 Day19 面向对象的三大特性之多态、封装 property的用法(1)

    一.课前内容回顾 继承作用:提高代码的重用性(要继承父类的子类都实现相同的方法:抽象类.接口) 继承解释:当你开始编写两个类的时候,出现了重复的代码,通过继承来简化代码,把重复的代码放在父类中. 单继 ...

  4. 10 python 封装----@property的用法

    1.基本概念 在python中用双下划线开头的方式将属性隐藏起来(设置成私有的) #其实这仅仅这是一种变形操作 #类中所有双下划线开头的名称如__x都会自动变形成:_类名__x的形式: class A ...

  5. 面向对象 - 封装/property - 总结

    面向对象 - 封装: 封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo 1.特点: 1.在类外部无法直接访问 _ ...

  6. 0417 封装 property、classmethod、staricmethod

    一.封装 把一堆东西装在一个容器里 函数和属性装到了一个非全局的命名空间 class A: __N = 123 # 静态变量 def func(self): print(A.__N) # 在类的内部使 ...

  7. python 类的封装/property类型/和对象的绑定与非绑定方法

    目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...

  8. Python 面向对象 组合-多态与多态性-封装-property

    面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...

  9. 组合+封装+property+多态+鸭子类型(day21)

    目录 昨日回顾 继承 什么是继承 继承的目的 什么是抽象 继承背景下,对象属性的查找顺序 派生 什么是派生 子类派生出新的属性,重用父类的属性 新式类和经典类 钻石继承的继承顺序 今日内容 一.组合 ...

随机推荐

  1. Android异步处理系列文章四篇之三

    Android异步处理一:使用Thread+Handler实现非UI线程更新UI界面Android异步处理二:使用AsyncTask异步更新UI界面Android异步处理三:Handler+Loope ...

  2. 【netcore基础】.Net core使用swagger自动生成开发文档

    之前写过一篇 .Net 版本的博客 https://www.cnblogs.com/jhli/p/8317566.html 现在只不过用了 netcore 之后的版本,其实差不多 netcore版本的 ...

  3. 10.9 Xadmin

    2018-10-9 13:53:39

  4. 电子产品使用感受之--Windows 10 小米笔记本Air HDMI转VGA无信号问题

    最近一直通过HDMI转VGA线缆链接我的戴尔P2314H显示器,前天睡觉前,看到电脑上英伟达显卡推了驱动更新,顺手更新了一下,就去睡觉了,转天晚上再用,HDMI接口就没有信号了,上网查了一些信息,获知 ...

  5. 一、SQL定义变量

    http://blog.csdn.net/changwei07080/article/details/7561602 在SQL我们使用declare定义局部变量,同时可以使用set和select 对变 ...

  6. Bootstrap框架 inconfont font-awesome

    Bootstrap框架和inconfont.font-awesome使用 iconfont的使用:https://www.cnblogs.com/clschao/articles/10387580.h ...

  7. Apache + PHP配置

    因工作需要,重新配置了Apache和PHP.想起当年曾经配置过,但是已经忘得差不多了.而且,也没有记录.从我个人来看,确实缺乏这样的训练,从国家教育体系来看,似乎也从未有过做科学记录的训练.中国的瓷器 ...

  8. [No0000176]Git常用命令速查表(收藏大全)

    名词 master: 默认开发分支 origin: 默认远程版本库 Index / Stage:暂存区 Workspace:工作区 Repository:仓库区(或本地仓库) Remote:远程仓库 ...

  9. [No0000154]详解为什么32位系统只能用4G内存.

    既然是详解, 就从最基础的讲起了. 或者1来存储数据的, 所以Bit实际上可以看成存放1个二进制数字的1个位置.也就是说bit只有2种值, 0 或者 1, 所以1个bit能存放1个布尔类型的值(boo ...

  10. MVC 实用架构设计(三)——EF-Code First(5):二级缓存

    一.前言 今天我们来谈谈EF的缓存问题. 缓存对于一个系统来说至关重要,但是是EF到版本6了仍然没有见到有支持查询结果缓存机制的迹象.EF4开始会把查询语句编译成存储过程缓存在Sql Server中, ...