面向对象 - 封装/property - 总结
面向对象 - 封装:
封装:在类定义阶段,以__开头的属性名发生了变形 eg: __x --> _A__x / __foo --> _A__foo
1.特点:
1.在类外部无法直接访问 __x 是 _A__x
2.在类内部可以直接使用 self.__foo() == self._A__foo()
3.子类无法覆盖父类以__开头的属性 因为根本不是一个名字 __x _A__x
2.总结:
这种变形需要注意的问题:
1.这种机制也并没有真正意义上限制我们从外部直接访问属性,知道了类名和属性名就可以拼出名字:_类名__属性,然后就可以访问了,
如a._A__N eg:print(A._A__x) 但一般不这样做!
2.变形的过程只在类的定义时发生一次,在定义后的赋值操作,不会变形 eg: b.__age=18 {'_B__name': 'alice', '__age': 18}
3.在继承中,父类如果不想让子类覆盖自己的方法,可以将方法定义为私有的 eg: def __foo(self): #_A__foo
3.意义:
1.封装数据属性的目的:(封装不是单纯意义上的隐藏)
明确的区分内外,控制外部对隐藏属性的操作行为 对接口 设定规则
2.封装方法属性的目的:
隔离复杂度 a=ATM() a.withdraw() 对接口 设定规则
4.扩展性:
def tell_area(self) 对使用者来说不用改变方式 开发者在类里面扩展
面向对象的三大特征:继承 多态 封装
面向对象的优点:可扩展性高
class A:
__x=1
def __init__(self,name):
self.name=name def __foo(self):
print('run foo') def bar(self):
self.__foo()
print('run bar') a=A('alice')
# print(a.__dict__)
# print(a.name)
# a.bar()
# # a.foo()
# a._A__foo()
# # print(a.__x)
# print(a._A__x)
# print(A.__dict__) # a.bar()
# a.__foo() # a.__x=1
# print(a.__dict__)
# print(a.__x)
# print(A.__dict__) # A.__x=2
# print(A.__x)
# print(A.__dict__) class Foo:
def __func(self):
print('from foo') class Bar(Foo):
def __init__(self,name):
self.__name=name def __func(self):
print('from bar') # b=Bar()
# # b.func()
# print(Foo.__dict__)
# print(Bar.__dict__) b=Bar('alice')
# print(b.__dict__)
# print(b.name)
# print(b._Bar__name) 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_fooo
print('B.foo') # b=B()
# b.bar() # print(A.__dict__)
# print(B.__dict__) 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('年龄必须是数字类型')
return
self.__name=name
self.__age=age p1=People('alice',12)
# print(p1.name,p1.age)
# print(p1.__dict__)
# p1.tell_info()
# p1.set_info('alex',18)
# p1.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() # a=ATM()
# a.withdraw() class Room:
def __init__(self,name,owner,weight,length,height):
self.name=name
self.owner=owner
self.__weight=weight
self.__length=length
self.__height=height def tell_area(self):
return self.__weight * self.__length * self.__height r=Room('客厅','alice',100,100,100)
# print(r.tell_area())
封装
面向对象 - property:
property:
1.@property 将函数属性 伪装成 数据属性
2.必须要有返回值 return ''
3.@property 查看 必须要有返回值 print(p.name) name 是函数属性 不是数据属性 伪装成 数据属性
@name.setter 修改 p.name='alex'
@name.deleter 删除 del p.name
总结:通过计算得来的方法 可以通过@property 伪装成数据属性
class People:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height @property
def bmi(self):
return self.weight / (self.height ** 2) p = People('alice',60,1.65)
# print(p.bmi())
# print(p.bmi)
# p.bmi=12 class People:
def __init__(self,name):
self.__name=name @property
def name(self):
return self.__name @name.setter
def name(self,val):
if not isinstance(val,str):
print('名字必须是str')
return
self.__name=val @name.deleter
def name(self):
print('不允许删除') p=People('alice')
print(p.name)
p.name='alex'
print(p.name)
del p.name
property
面向对象 - 封装/property - 总结的更多相关文章
- Python 面向对象 组合-多态与多态性-封装-property
面向对象-组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo: xxx = 111 class Bar: yyy = 222 obj = Foo( ...
- 从普通函数到对象方法 ------Windows窗口过程的面向对象封装
原文地址:http://blog.csdn.net/linzhengqun/article/details/1451088 从普通函数到对象方法 ------Windows窗口过程的面向对象封装 开始 ...
- Python之面向对象封装
Python之面向对象封装 封装不是单纯意义的隐藏 什么是封装: 将数据放在一个设定好的盒子里,并标出数据可以实现的功能,将功能按钮外露,而隐藏其功能的工作原理,就是封装. 要怎么封装: 你余额宝有多 ...
- python面向对象(封装、多态、反射)
目录 面向对象之封装 @property 面向对象之多态 面向对象之反射 面向对象之封装 含义 将类中的某些名字按照特殊的书写方式"隐藏"起来,不让外界直接调用,目的是为了不然外界 ...
- Java面向对象㈠ -- 封装
Java的面向对象有三大特征:封装.继承.多态.这里主要对封装进行讲解. 封装可以理解为隐藏一个类的成员变量和成员函数,只对外提供需要提供的成员函数. Java的封装主要通过访问权限控制符:priva ...
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一 三个基本的特性:封装.继承与多态1 1.2. 魔 ...
- Atitit 面向对象 封装的实现原理
Atitit 面向对象 封装的实现原理 1.1. 动态对象的模拟使用map+函数接口可以实现1 1.2. 在用结构体 + 函数指针 模拟 对象 1 1.3. This指针..1 1.4. " ...
- java基础1.0::Java面向对象、面向对象封装、抽象类、接口、static、final
一.前言 一直以来都是拿来主义,向大神学习,从网上找资料,现在就把自己在工作中和学习中的所理解的知识点写出来,好记星不如烂笔头,一来可以作为笔记自己温习,二来也可以给走在求学之路的同学们一点参考意见, ...
- OC面向对象—封装
OC面向对象—封装 一.面向对象和封装 面向对象的三大特性:封装(成员变量).继承和多态 在OC语言中,使用@interface和@implementation来处理类. @interface就好像暴 ...
随机推荐
- JUC组件扩展(二)-JAVA并行框架Fork/Join(二):同步和异步
在Fork/Join框架中,提交任务的时候,有同步和异步两种方式. invokeAll()的方法是同步的,也就是任务提交后,这个方法不会返回直到所有的任务都处理完了. fork方法是异步的.也就是你提 ...
- bitnami-redmineserver迁移
1. 背景 在Redmineserver迁移过程中.假设前后两个Redmine的版本号一样,事情就简单,假设版本号不一样,就有可能面临两个版本号数据库不兼容.那就比較麻烦了.本文旨在介绍数据库不兼容时 ...
- 怎样使用Debussy+ModelSim快速查看前仿真波形
引子:ModelSim是HDL仿真软件,Debussy是波形查看软件:搭配使用,相当爽.此处所谓快速查看前仿真波形仅为抛砖引玉,大家不要拘泥于此.两款软件的功能都很强大,请自行研究. 注:本篇博文的软 ...
- [gj]来公司停电了-维护机器
停电出现的问题 一早来机房跳闸了. 很多vm手动起来后有些服务不太正常了. 机房锁坏了.不知道谁进去干啥了.导致跳闸 闸门不知道在哪里.导致所有机器停电了 牵扯到的技术点: 1,nexus启动. ng ...
- 构建自己的embedded linux系统
[教程]使用buildroot完全自定义自己的embedded linux系统(nand)http://www.eeboard.com/bbs/thread-38377-1-1.html [教程] [ ...
- 使用JSP实现用户登录
本文讲述使用JSP实现用户登录,包括用户登录.注册和退出功能等. 1.系统用例图 2.页面流程图 3.数据库设计 本例使用oracle数据库 创建用户表 包括id,username,password和 ...
- pl/sql 实例解析 01
1. 合并 firstname, lastname. 1: declare 2: v_first_name varchar2(255); 3: v_last_name varchar2(255); 4 ...
- Java异常框架设计
什么是异常? 异常(exception)应该是异常事件(exceptional event)的缩写.异常定义:异常是一个在程序执行期间发生的事件,它中断正在执行的程序的正常的指令流.当在一个方法中发生 ...
- JAVA源文件中是否可以包括多个类,有什么限制
JAVA源文件中是否可以包括多个类,有什么限制 解答:一个java源文件中可以包含多个类,每个源文件中至多有一个public类,如果有的话,那么源文件的名字必须与之相同.如果源文件中没有public类 ...
- AWT提供了Java Applet 和Java Application中可用的用户图形界面 GUI 中的基本组件
AWT提供了Java Applet 和Java Application中可用的用户图形界面 GUI 中的基本组件( component s). 由于Java是一种独立于平台的 程序设计语言 ,但GUI ...