__get__()方法研究
看源码的时候发现了这个魔法方法
class A(object):
def __init__(self):
self.name = 'mod' def __get__(self, instance, owner):
print(instance, '=====', owner)
return self class B(object):
a = A() class C(object):
d = A() def __init__(self):
self.a = A() b = B()
c = C() print(B.a)
# None ===== <class '__main__.B'>
# <__main__.A object at 0x7f0485e519b0> print(b.a)
# <__main__.B object at 0x7f0484825b70> ===== <class '__main__.B'>
# <__main__.A object at 0x7f0485e519b0> print(b.a.name)
# <__main__.B object at 0x7f0484825b70> ===== <class '__main__.B'>
# mod print(c.a)
# <__main__.A object at 0x7f0485e33208> print(c.d)
# _main__.C object at 0x7f0484825b38> ===== <class '__main__.C'>
# <__main__.A object at 0x7f0484825c18>
依次总结:
第一次打印,通过类调用类属性,打印结果,instance为None,可以理解, get方法的第一个参数为调用该方法的实例,第二个为该实例所属的类
第二次打印,通过实例调用类属性,打印结果印证了上面的结论
第三次打印,仅证明该属性正常可用
第四次打印,通过实例调用作为实例属性的A(),结果发现没有触发__get__方法,说明__get__方法仅仅是作为类属性的时候才会被触发
第五次打印,证明以上结论
另外,__get__方法必须带有两个参数,这是被调用时强制携带的,不然会报错如下:
TypeError: __get__() takes 2 positional arguments but 3 were given
那么这个方法有啥用处呢,其实玩法还挺多的,我能想到的一个就是可以限制别的类乱调用.比如判断将该类定为类属性的类是不是我们期望的类,如果不是,那就返回空.
__get__()方法研究的更多相关文章
- [转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching)
[转]UDP/TCP穿越NAT的P2P通信方法研究(UDP/TCP打洞 Hole Punching) http://www.360doc.com/content/12/0428/17/6187784 ...
- (手写识别) Zinnia库及其实现方法研究
Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...
- Android Service 通知Activity更新界面的方法研究
Android Service 通知Activity更新界面的方法研究 Android的最重要的组件式service和activity,那么在使用的过程中,我们最常遇到的问题是他们之间的通信问题. ...
- 基于MATLAB的多项式数据拟合方法研究-毕业论文
摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...
- RapidIOIP核的验证方法研究_王玉欢
RapidIOIP核的验证方法研究_王玉欢 https://wenku.baidu.com/view/0fd3c925d4d8d15abf234e73.html
- 基于FPGA实现的高速串行交换模块实现方法研究
基于FPGA实现的高速串行交换模块实现方法研究 https://wenku.baidu.com/view/9a3d501a227916888486d7ed.html
- 《基于 UML 的教务系统设计方法研究》论文笔记(十五)
标题:基于 UML 的教务系统设计方法研究 时间:2009 来源:太原师范学院 关键词:UML:面向对象:建模:教务管理系统. 二.研究内容 UML 建模 UML 涵盖了面向对象的分析.设计和实现,融 ...
- python的__get__方法看这一篇就足够了
get类型函数 直接上代码: class TestMain: def __init__(self): print('TestMain:__init__') self.a = 1 if __name__ ...
- 基于MIndSpore框架的道路场景语义分割方法研究
基于MIndSpore框架的道路场景语义分割方法研究 概述 本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标 ...
随机推荐
- 浅谈Sass与Less区别、优缺点
Sass是一种动态样式语言,Sass语法的缩排语法,比Css比多出很多功能,如变量,嵌套,运算,继承,颜色处理,函数等,易于阅读.Cass的安装需要安装Ruby环境,是服务器端处理的,Less是需要引 ...
- nl---统计行号
nl命令读取 file 参数(缺省情况下标准输入),计算输入中的行号,将计算过的行号写入标准输出.在输出中,nl命令根据您在命令行中指定的标志来计算左边的行.输入文本必须写在逻辑页中.每个逻辑页有头. ...
- struts2.x + Tiles2.x读取多个xml 配置文件
在web.xml中配置如下即可: <context-param> <param-name>org.apache.tiles.impl.BasicTilesContainer.D ...
- placement new和delete
注意,我们无法改变new和delete操作符. 但是我们可以重载来里面的operator new 和 operator delete 方法,这个方法是被new操作符调用的,调用之后获得地址,会继续用构 ...
- POJ 1152 An Easy Problem! (取模运算性质)
题目链接:POJ 1152 An Easy Problem! 题意:求一个N进制的数R.保证R能被(N-1)整除时最小的N. 第一反应是暴力.N的大小0到62.发现当中将N进制话成10进制时,数据会溢 ...
- OC07 -- 迭代器/NSNumber/NSValue/NSRange/NSSet/NSDate 及相互转换.(杂)
//一: 迭代器 //数组 NSArray *arr=@[@"1",@"2",@"3",@"4",@"5&qu ...
- vue-router学习例子分享
http://blog.csdn.net/bboyjoe/article/details/52804988 <!DOCTYPE html> <html lang="en&q ...
- jquery.base64.js
(function($) { $.base64 = function(options) { var defaults = { data:"", type:0, unicode:tr ...
- 联想杨天 S4130-12 win10改win7 bios参数设置
一.进入bios 开机后按 F1 二.改bion参数 1.移动到 save& Exit ,修改 OS optimized defaults 为“Disbled” 再 “F9” 保存 2. ...
- Hexo High一下以及压缩排版问题
背景介绍 集成Hight一下以及Gulp-html压缩之后出现的问题: High一下功能多次点击,会创建多个Audio对象,导致同时播放多次音乐,重音.解决办法:判断是否添加Audio对象,如果存在则 ...