python基础-面向对象编程之封装、访问限制机制和property
面向对象编程之封装
封装
定义:将属性和方法一股脑的封装到对象中,使对象可通过“对象.”的方式获取或存储数据。
作用:让对象有了"."的机制,存取数据更加方便
# 定义类,调用类创建对象,这个过程可理解为封装
class Teacher:
def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender
def score(self):
print(f"{self.name}老师正在修改分数……")
tea = Teacher("lee", 27, "男")
print(tea.name, tea.age, tea.gender)
tea.score()
访问限制机制
定义:凡是在类内部定义的属性或方法,以__开头的,都会被限制,外部不能直接访问
这种机制看起来像是将属性和方法隐藏起来了,以__开头的属性或方法,等价于 _类名__属性 或 _类名__方法()
作用:将隐私数据,隐藏起来,不让外部轻易获取。
与其他编程语言的区别:
其他语言就是私有化,限制访问。但在python中,仅仅是隐藏,这是python独有的特性
class Person:
__name = "lee"
__age = 18
__gender = "男"
def __init__(self, name, age, gender):
self.__name = name
self.__age = age
self.__gender = gender
def __userinfo(self):
print(f"姓名:{self.__name},年龄:{self.__age},性别:{self.__gender}")
person = Person("dawn", 27, "男")
print(person.__name) # 输出报错 AttributeError: 'Person' object has no attribute '__name'
person.__userinfo() # 输出报错 AttributeError: 'Person' object has no attribute '__userinfo'
# 被__修饰的属性或者方法,可以通过 _类名__属性或_类名__方法名() 来访问
print(person._Person__name) # 输出结果:dawn
person._Person__userinfo() # 输出结果:姓名:dawn,年龄:27,性别:男
被__修饰的属性和方法,只能在当前类中使用
class A:
def __fa(self): # 4._A_fa()
print('from A') # 5.最终输出的是就是 from A
def test(self): # 2.test(b) 虽然这里传入的是对象b
self.__fa() # 3.但是因为类的访问限制机制,这里强制换成成了 _A__fa()
class B(A):
def __fa(self): # _B__fa()
print('from B')
b = B()
b.test() # 1.对象b 和当前子类B 中都没有 test(),所以去父类A中查找
输出结果
from A
property
定义: python内置的装饰器,用于将对象.方法()调整成对象.方法,类似获取属性的方式调用方法。
作用:在某些情况下,方法返回的仅仅是处理后的数据。为了让调用者更方便的使用,将方法的调用方式修改成了类似属性的调用方式。
class User:
def __init__(self, weight, height):
self.weight = weight
self.height = height
@property
def bmi(self):
return self.weight / (self.height ** 2)
# 创建user对象
user_obj = User(46, 1.56)
# bmi()方法使用了property装饰器,调用的时候,不加()
print(user_obj.bmi) # 输出结果:18.902038132807363
# 调用时,加了(),相当于user_obj.bmi()()
print(user_obj.bmi()) # 报错 TypeError: 'float' object is not callable
加了property装饰器后,调用者很容易将方法当作属性去修改或者删除.但是方法是不能通过对象.去修改删除的。
为了让调用者可以像处理属性一样的去修改或者删除,python提供了@被装饰方法名.setter来修改方法,@被装饰方法名.delter来删除方法
class User:
def __init__(self, weight, height):
# self.name = name
self.weight = weight
self.height = height
self.__getbmi = self.weight / (self.height ** 2)
@property # 对象.bmi() ----→ 对象.bmi
def bmi(self):
return self.__getbmi
@bmi.setter # 允许修改 对象.bmi()中的值
def bmi(self, value):
self.__getbmi = value
@bmi.deleter # 允许删除 对象.bmi()中的值
def bmi(self):
del self.__getbmi
# 创建user对象
user_obj = User(46, 1.56)
# print(user_obj.bmi()) # 报错,user_obj.bmi() ----→ user_obj.bmi()()
print(user_obj.bmi) # 输出结果:18.902038132807363
user_obj.bmi = 18 # 修改bmi 的值。
print(user_obj.bmi) # 输出结果:18
del user_obj.bmi # 删除bmi
print(user_obj.bmi) # 报错,bmi 被删除了
python基础-面向对象编程之封装、访问限制机制和property的更多相关文章
- python基础-面向对象编程之继承
面向对象编程之继承 继承的定义:是一种新建类的方式,新建的类称之为子类或派生类,被继承的父类称之为基类或超类 继承的作用:子类会""遗传"父类的属性,从而解决代码重用问题 ...
- python基础-面向对象编程之反射
面向对象编程之反射 反射 定义:通过字符串对对象的属性和方法进行操作. 反射有4个方法,都是python内置的,分别是: hasattr(obj,name:str) 通过"字符串" ...
- python基础-面向对象编程之多态
面向对象编程之多态以及继承.抽象类和鸭子类型三种表现形式 多态 定义:同一种类型的事物,不同的形态 作用: 多态也称之为"多态性".用于在不知道对象具体类型的情况下,统一对象调用方 ...
- python基础-面向对象编程之组合
面向对象编程之组合 定义:一个对象中拥有另一个或其他多个对象的属性和方法. 作用:减少代码的冗余,降低耦合度 关于耦合度的说明 耦合:通俗地讲,就是相互作用,相互影响的意思 耦合度越高,程序的可扩展性 ...
- Python基础教程之udp和tcp协议介绍
Python基础教程之udp和tcp协议介绍 UDP介绍 UDP --- 用户数据报协议,是一个无连接的简单的面向数据报的运输层协议.UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但 ...
- 面向对象——组合、封装、访问限制机制、property内置装饰器
面向对象--组合.封装.访问限制机制.property 组合 什么是组合? 组合指的是一个对象中,包含另一个或多个对象 为什么要组合? 减少代码的冗余 怎么用组合? # 综合实现 # 父类 class ...
- Python基础教程之List对象 转
Python基础教程之List对象 时间:2014-01-19 来源:服务器之家 投稿:root 1.PyListObject对象typedef struct { PyObjec ...
- Python 面向对象编程之封装的艺术
1. 面向对象编程 OOP ( Object Oriented Programming) 即面向对象编程. 面向对象编程是一种编码思想,或是一种代码组织方式.如同编辑文章时,可以选择分段.分节的方式 ...
- java学习笔记(基础篇)—面向对象编程之封装、继承、多态
一. OOP中的基本概念 Java的编程语言是面向对象的,采用这种语言进行编程称为面向对象编程(Object-Oriented Programming, OOP), 它允许设计者将面向对象设计实现为一 ...
随机推荐
- LHH的acm奋斗史,至强的精神(转载)
还记得2年前的一个晚上,我和一个女孩一起写完了这篇文章.写完后,她哭了,我笑了.然后,她走了,我哭了.2年后,我又找到她,这次,我没有让她走掉,她成了我的新娘. 不知道什么时候,开始知道ACM:也不知 ...
- redis系列之------对象
前言 Redis 并没有直接使用数据结构来实现键值对数据库, 而是基于这些数据结构创建了一个对象系统, 这个系统包含字符串对象.列表对象.哈希对象.集合对象和有序集合对象这五种类型的对象, 每种对象都 ...
- django-URL默认参数传递
主要用在分页中. book/views.py def page(request,pn=): return HttpResponse("<h1>{}</h1>" ...
- 在windows下用with open 打开html文件报gbk错误
with open('xx.html' , 'rb' ,enconding='utf-8')as f: 可能原因是由于HTML是在Linux下开发的,与windons 系统编码不兼容
- Linux后台运行Jar方法
原文地址:http://blog.csdn.net/c1481118216 https://blog.csdn.net/c1481118216/article/details/53010963 在li ...
- phpstorm 2016.2.2 激活
2016年7月14日 phpstorm 推送2016.2 更新 2016年10月25日phpstorm 推送2016.2.2 更新 2016年11月24日phpstorm 推送2016.3 更新 下面 ...
- 中级前端必备知识点(2.5w+月薪)进阶 (分享知乎 : 平酱的填坑札记 关注专栏 用户:安大虎)
前端已经不再是5年前刚开始火爆时候的那种html+css+js+jquery的趋势了,现在需要你完全了解前端开发的同时,还要具备将上线.持续化.闭环.自动化.语义化.封装......等概念熟练运用到工 ...
- 洛谷P5522 【[yLOI2019] 棠梨煎雪】
区间操作考虑用线段树维护. 建\(n*2\)棵线段树,前\(n\)棵线段树维护每个串的第i位是否是0. 后\(n\)棵线段树维护每个串的第i位是否是1. 如果是问号的话,直接跳过就好(通过1和0能看出 ...
- 说一说JVM双亲委派机制与Tomcat
双亲委派模型与JVM 类加载 讲个故事: 以前,爱捣鼓的小明突然灵机一动,写出了下面的代码 package java.lang; public class String { //...复制真正Stri ...
- ASP.NET Core主机地址过滤HostFiltering
前言 在ASP.Net Core2.X调用的CreateWebHostBuilder和3.X的主要区别在于WebHost的调用,CreateDefaultBuilder被Host替换,另一个区别是对C ...