封装

封装:主要是指在类的定义阶段将,以__开头的属性名进行变形.。例如:__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. ASP.NET MVC 4 (十一) Bundles和显示模式

    Bundles用于打包CSS和javascript脚本文件,优化对它们的组织管理.显示模式则允许我们为不同的设备显示不同的视图. 默认脚本库 在VS创建一个MVC工程,VS会为我们在scripts目录 ...

  2. Linux中 SonarQube代码质量管理平台安装

    SonarQube是管理代码质量一个开源平台,可以快速的定位代码中潜在的或者明显的错误. SonarQube安装 1.环境准备 (1)sonarQube 下载地址https://www.sonarqu ...

  3. java基本数据结构和算法

    private class Node {  6 private Object data; //数据 7 private Node next = null; //指向下个结点的引用 8 9 public ...

  4. Hadoop工作原理

    hadoop的核心思想是MapReduce,其处理数据的基本原理:在执行mapreduce之前,原始数据被分割成若干split,每个split作为一个map任务的输入,在map执行过程中split会被 ...

  5. windows 开启热点的命令行工具

    hotspot.bat @echo off @echo. setlocal enabledelayedexpansion if "%1" == "set" ( ...

  6. Python把两个列表合成一个字典

    简单粗暴上代码 A= [] B = [] C= dict(map(lambda x,y:[x,y],A,B)) 酱紫,就合成了一个字典

  7. 坑!vue.js在ios9中失效

    坑!vue.js在ios9中失效! 接到实现,在移动端生成一个分享链接,分享到微信,在微信中打开,加入! 好,用vue实现----------------------->写代码--------- ...

  8. DB2创建数据库常用参数详解

    转自http://czmmiao.iteye.com/blog/1335801 DB2创建数据库常用参数详解 本文只介绍DB2 create database语法中的常用参数http://publib ...

  9. IIS Asp.Net 访问 Com组件 报拒绝访问

    IIS Asp.Net 访问 Com组件 报拒绝访问 解决方法: IIS 程序池->高级设置->进程模式->标识->内置帐户=LocalSystem

  10. 洛谷P1098 字符串的展开【字符串】【模拟】

    题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母或数 ...