封装

封装:主要是指在类的定义阶段将,以__开头的属性名进行变形.。例如:__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. win7 cmd终端连接android手机运行adb shell脚本命令

    win7 cmd终端连接android手机运行adb shell脚本命令 (2013-03-22 20:13:57) 转载▼ 标签: android it shell 连接 linux 分类: 嵌入式 ...

  2. 【Spring】Spring中用到的设计模式

    1.简单工厂 又叫静态工厂方法模式,不属于23种设计模式之一. 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类. Spring中的BeanFactory就是简单工厂模式的 ...

  3. 写写我的硕士三年【zz】

    昨天我们组的10bit-40M ADC测出来了,自己终于能松口气,可以无牵无挂的毕业了.晚上老板bg全组毕业生,喝了很多,我对老板说:"这3年在组里,我是把它当作事业来做的!"是的 ...

  4. 解决css设置背景透明,文字不透明

    设置元素的透明度:  -moz-opacity:0.8; /*在Firefox中设置元素透明度  filter: alpha(opacity=80); /*ie使用滤镜设置透明   但是当我们对一个标 ...

  5. iOS-Core Animation: 变换

    仿射变换 用 CGPoint 的每一列和 CGAffineTransform 矩阵的每一行对应元素相乘再求 和,就形成了一个新的 CGPoint 类型的结果.要解释一下图中显示的灰色元素, 为了能让矩 ...

  6. J - Vertical Histogram(1.5.7)

    J - Vertical Histogram(1.5.7) Time Limit:1000MS    Memory Limit:65536KB    64bit IO Format:%I64d &am ...

  7. js事件绑定的几种方式

    在JavaScript中,有三种常用的绑定事件的方法: 在DOM元素中直接绑定: 在JavaScript代码中绑定: 绑定事件监听函数 一. 在DOM元素中直接绑定 这里的DOM元素,可以理解为HTM ...

  8. [No0000D7]img生成器.bat合并所有图片到html网页中

    @ECHO OFF IF EXIST %~nx0.html DEL /F /Q %~nx0.html ECHO ^<html^>^<head^>^<title^>% ...

  9. 关于Java的基础语法整理

  10. iphone及ipad屏幕尺寸参考

    初代iPhone 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone 3GS也保持不变.那时编写iOS的App(应 ...