day22-类的封装、property特性以及绑定方法与非绑定方法
类的封装
将类的属性或方法隐藏,这些属性和方法只能在内部使用,外部无法使用。类的封装在类定义阶段就执行了,会把私有属性_x变成_类名__x
两个层面的封装
第一个层面
第一个层面的封装(什么都不用做):创建类和对象会分别创建二者的名称空间,我们只能用类名.或者obj.的方法去访问里面的名字,这本身就是一种封装
第二个层面
第二个层面的封装:类中把某些属性和方法隐藏起来(或者说定义成私有的)只在类的内部使用、外部无法访问,或者留下少量接口(函数)功外部访问
在python中用双下划线的方式实现隐藏属性(设成私有的)
class People:
__name = 'nick' # 设置成私有属性,在内部可以使用,在外部无法使用
print(__name) # nick
def __sleep(self):
print('from People')
def eat(self):
print('from eat')
peo = People()
peo.eat() # from eat
peo.__name() # 打印报错 'People' object has no attribute '__name'
peo.__sleep() # 打印报错 'People' object has no attribute '__sleep'
如果要想访问有属性可以通过“_类名__私有属性”来使用
class People:
__name = 'nick'
peo = People()
print(peo._People__name)
nick
封装的好处
- 数据封装:将数据隐藏起来这不是目的。隐藏起来然后对外提供操作该数据的接口,然后我们可以在接口附加上对该数据操作的限制,以此完成对数据属性操作的严格控制
- 封装方法:目的是隔离复杂度
私有模块
就是在模块内定义私有属性或函数如:_name = 'nick',在导入该模块时from module import * 无法导入该私有属性_name,若要导入则使用from module import _x
类的propertry特性
property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用
# 没加property装饰器
class People:
def __init__(self, height, weight):
self.height = height
self.weight = weight
def bmi(self):
return self.weight/(self.height ** 2)
peo = People(1.8, 70)
print(peo.bmi())
21.604938271604937
class People:
def __init__(self, height, weight):
self.height = height
self.weight = weight
@property # 将装饰器后,将bmi函数伪装成一个数据属性
def bmi(self):
return self.weight/(self.height ** 2)
peo = People(1.8, 70)
print(peo.bmi) # 不用加括号直接使用
21.604938271604937
setter 和 deleter
class People():
def __init__(self,height,weight):
self.height = height
self.weight = weight
@property # 获取值的时候触发,你不需要加括号使用,不能加参数
def bmi(self):
return self.weight/(self.height**2)
@bmi.setter # 在修改bmi的时候触发,必须得加参数
def bmi(self, value):
print(f'不能修改成{value}')
@bmi.deleter # 在删除bmi的时候触发,不能加参数
def bmi(self):
print('delter')
peo = People(1.8,70)
print(peo.bmi)
print('*'*50)
peo.bmi = 50
print(peo.bmi)
print('*'*50)
del peo.bmi
print(peo.bmi)
21.604938271604937
**************************************************
不能修改成50
21.604938271604937
**************************************************
delter
21.604938271604937
类与对象的绑定方法与非绑定方法
绑定给谁,就将谁传给函数中的第一个参数作为self
class F:
# 默认绑定给对象,只有对象能用,但是类也能使用,使用的时候必须得传参
def f1(self):
print(self)
# 绑定给类的方法,类能使用,对象也能使用,但是参数依然是类
@classmethod # 让被装饰的函数给类使用,约定俗成参数为cls
def f2(cls):
print(cls)
# 什么都不绑定,非绑定方法,定义为普通的函数
@staticmethod
def f3(self):
print(self)
f = F()
f.f1()
F.f1(111)
print("*" * 30)
f.f2()
F.f2()
print("*" * 30)
f.f3('from f')
F.f3('from F')
<__main__.F object at 0x000001CE0E2EDFD0>
111
******************************
<class '__main__.F'>
<class '__main__.F'>
******************************
from f
from F
总结
- 对象的绑定方法:没有加任何装饰的方法就是对象的绑定方法
- 类的绑定方法:加了@classmethod装饰器的方法就是类的绑定方法
- 非绑定方法:加了@staticmethod装饰器的方法就是非绑定方法,其实就是一个普通的函数
day22-类的封装、property特性以及绑定方法与非绑定方法的更多相关文章
- 类的封装,property特性,类与对象的绑定方法和非绑定方法,
类的封装 就是把数据或者方法封装起来 为什么要封装 封装数据的主要原因是:保护隐私 封装方法的主要原因是:隔离复杂度(快门就是傻瓜相机为傻瓜们提供的方法,该方法将内部复杂的照相功能都隐藏起来了,比如你 ...
- Python面向对象之封装、property特性、绑定方法与非绑定方法
一.封装 ''' 1.什么封装 封:属性对外是隐藏的,但对内是开放的(对内是开放的是因为在类定义阶段这种隐藏已经发生改变) 装:申请一个名称空间,往里装入一系列名字/属性 2.为什么要封装 封装数据属 ...
- python 类的封装/property类型/和对象的绑定与非绑定方法
目录 类的封装 类的property特性 类与对象的绑定方法与非绑定方法 类的封装 封装: 就是打包,封起来,装起来,把你丢进袋子里,然后用绳子把袋子绑紧,你还能拿到袋子里的那个人吗? 1.隐藏属性和 ...
- python 类的绑定方法和非绑定方法
一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. class People: def __ ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
- Day7 子类调用父类的方法supper 绑定方法与非绑定方法
supper:可以利用supper来重用父类的方法,可以不用指名道姓的调用了. class OldboyPeople: school = 'oldboy' def __init__(self,name ...
- Day 5-5 绑定方法与非绑定方法
绑定方法与非绑定方法: 在类内部定义的绑定方法,分两大类: classmehtod是给类用的,即绑定到类,类在使用时会将类本身当做参数传给类方法的第一个参数(即便是对象来调用也会将类当作第一个参数传入 ...
- Learning-Python【25】:绑定方法与非绑定方法
类中定义函数分为了两大类,绑定方法与非绑定方法,它们有一些特殊之处: 1.绑定方法特殊之处:绑定给谁就应该由谁来调用,谁来调用就会将谁当做第一个参数自动传入 绑定给对象的方法:这个在面向对象第一篇第六 ...
随机推荐
- Enterprise Architect 生成项目类图
Enterprise Architect使用教程: https://blog.csdn.net/chenglc1612/article/details/81083151 主要流程 --到此-自动生成完 ...
- POJ - 1470 Closest Common Ancestors(离线Tarjan算法)
1.输出测试用例中是最近公共祖先的节点,以及这个节点作为最近公共祖先的次数. 2.最近公共祖先,离线Tarjan算法 3. /* POJ 1470 给出一颗有向树,Q个查询 输出查询结果中每个点出现次 ...
- bzoj 2208: [Jsoi2010]连通数【tarjan+拓扑+dp】
我总觉得枚举点bfs也行-- tarjan缩点,记一下每个scc的size,bitset压一下scc里的点,然后按拓扑倒序向上合并到达状态,然后加ans的时候记得乘size #include<i ...
- bzoj 4822: [Cqoi2017]老C的任务【扫描线+树状数组+二维差分】
一个树状数组能解决的问题分要用树套树--还写错了我别是个傻子吧? 这种题还是挺多的,大概就是把每个矩形询问差分拆成四个点前缀和相加的形式(x1-1,y1-1,1)(x2.y2,1)(x1-1,y2,- ...
- 11.3NOIP模拟赛
/* 考虑贪心 把原序列排序后,对于原中位数往后所有比要更改到的值小的都改成它 正确性显然. */ #include<iostream> #include<cstdio> #i ...
- P4170 [CQOI2007]涂色
传送门 区间dp,设\(f[l][r]\)表示区间\((l,r)\)的最小次数,当\(l==r\)时为\(1\),当\(s[l]==s[r]\)时为\(min(f[l][r-1],f[l+1][r]) ...
- js 几秒之后就不断的执行
function url() { $.ajax({ url: "AA.ashx", data: { ID: "gggg ...
- [Usaco2008 Dec]Patting Heads 轻拍牛头
Description 今天是贝茜的生日,为了庆祝自己的生日,贝茜邀你来玩一个游戏. 贝茜让N(1≤N≤100000)头奶牛坐成一个圈.除了1号与N号奶牛外,i号奶牛与i-l号和i+l号奶牛相邻.N号 ...
- 洛谷 P2634 [国家集训队]聪聪可可
点分板子2333 注释都是错过的地方 #include<cstdio> #include<algorithm> using namespace std; typedef lon ...
- Kruskal算法 分类: c/c++ 算法 2014-10-01 17:09 540人阅读 评论(0) 收藏
Kruskal算法计算最小生成树,只与边有关,时间复杂度O(eloge) 步骤: 1.将边按权值递增排序 2.依次取出边加入最小生成树中并保证无环,判断是否成环可利用并查集. 例:http://ac. ...