python函数实例与类实例_python – 在类和实例上表现不同的函数

好问题!您使用描述符可以轻松完成您所寻求的内容.

Descriptors是实现描述符协议的Python对象,通常以__get __()开头.

它们主要存在于不同类中的类属性.在访问它们时,将调用它们的__get __()方法,并传入实例和所有者类.

class DifferentFunc:

"""Deploys a different function accroding to attribute access

I am a descriptor.

"""

def __init__(self, clsfunc, instfunc):

# Set our functions

self.clsfunc = clsfunc

self.instfunc = instfunc

def __get__(self, inst, owner):

# Accessed from class

if inst is None:

return self.clsfunc.__get__(None, owner)

# Accessed from instance

return self.instfunc.__get__(inst, owner)

class Test:

@classmethod

def _get_other_thing(cls):

print("Accessed through class")

def _get_other_thing_inst(inst):

print("Accessed through instance")

get_other_thing = DifferentFunc(_get_other_thing,

_get_other_thing_inst)

现在结果如下:

>>> Test.get_other_thing()

Accessed through class

>>> Test().get_other_thing()

Accessed through instance

那很简单!

顺便问一下,你注意到我在类和实例函数上使用了__get__吗?你猜怎么着?函数也是描述符,这就是它们的工作方式!

>>> def func(self):

... pass

...

>>> func.__get__(object(), object)

>

在访问函数属性时,会调用__get__,这就是你如何获得函数绑定.

有关更多信息,我强烈建议阅读上面链接的Python manual和“How-To”.描述符是Python最强大的功能之一,几乎不为人所知.

为什么不在实例化时设置功能?

或者为什么不在__init__中设置self.func = self._func?

在实例化时设置函数会带来很多问题:

> self.func = self._funccauses循环引用.该实例存储在self._func返回的函数对象中.另一方面,这在分配期间存储在实例上.最终结果是实例引用自身并以更慢和更重的方式清理.

>与您的类交互的其他代码可能会尝试直接从该类中获取该函数,并使用__get __()(这是通常的预期方法)来绑定它.他们将收到错误的功能.

>不适用于__slots__.

>虽然使用描述符需要了解机制,但在__init__上设置它并不是很干净,需要在__init__上设置多个函数.

>需要更多记忆.您可以为每个实例存储绑定函数,而不是存储单个函数.

>不适用于properties.

随着列表的不断发展,我还没有添加更多内容.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1024电商项目的邮箱验证码与图形验证码功能模块

项目基于springcloudalibaba,模块功能大致概括就是登录页面的时候先完成图形验证码的校验,输入的数字和字母与图片上的相对应之后,会向对应的邮箱或手机号发送邮箱/短信验证码二次验证。这里展示的是邮箱验证码。 用到的技术点有&#xff1a…

Android自己的自动化测试Monkeyrunner和用法示例

眼下android SDK在配有现成的测试工具monkey 和 monkeyrunner两。也许我们不看一样的兄弟名字。但事实是完全跑了两个完全不同的工具。在测试的不同区域的应用程序。总体,monkey主要用于压力和可靠性测试,拟键盘事件流。而且能够自定义发送的次数&#x…

内存大对象dump linux_在 Linux 上创建并调试转储文件 | Linux 中国

了解如何处理转储文件将帮你找到应用中难以重现的 bug。• 来源:linux.cn • 作者:Stephan Avenwedde • 译者:Xingyu.Wang •(本文字数:5501,阅读时长大约:6 分钟)崩溃转储、内存转储、核心转储、系统转储…

关于软件工程的那些事儿————《人·绩效·职业道德》和《一个程序员的生命周期》读后感...

对于这片文章,首先标题很亮眼--------“人绩效职业道德”。 首先,是“人”。我个人的理解,“人”在团队中有着重要的作用。一个人不可能独立的存在,无论是在学习工作还是生活中,都需要与他人的合作才能完成每项任务。通…

爬虫用mysql存储还是mongodb_【面试题】Mongodb和MySQL存储爬虫数据的特点是什么?...

(1)问题分析面试官主要考核Mongodb和MySQL数据库的特点,以及关系型与非关系型数据库。(2)核心问题讲解MySQL属于关系型数据库,它具有以下特点:在不同的引擎上有不同的存储方式。查询语句是使用传统的sql语句,拥有较为成熟的体系&a…

mysql originator_MySQL数据库事件调度(Event)

4.创建事件调度每5秒在表中插入数据MySQL> create event if not exists event_t1 on schedule every 5 second do insert into t values(1,1,sysdate());Query OK, 0 rows affected (0.01 sec)mysql> select * from t; --查看事件执行数据-------------------…

你的灯亮着么阅读笔记3

第五章问题从哪来的。我们要探寻问题的根源,而问题的根源往往出现在自身。因此我们要时常的反思自己,是否在团队中拖了后腿,而不是一味的去指责队友对自己的埋怨。只有发现自身的问题,才能改正自我。 第六章我们真的想解决问题么。…

python web 框架的flash消息_Flask flash 消息闪现

浮生梦,三生渺渺,因缘无踪,虽堪恋,何必重逢。息壤生生,谁当逝水,东流无终。flash传递与获取数据#coding:utf-8# flash是生成传递数据,get_flashed_messages是获取传递过来的数据from flask impo…

OC-NSFileManager和NSFileHandle的使用

对于objective-c中的有关文件目录的操作和文件的操作。 通过一道习题来熟悉NSFileManager和NSFileHandle中的方法的使用。 本题原意:将指定目录下所有后缀名为XXX(可以自己输入)的文件中字符串为"him"(可以自己输入)改为"me"(可以自己输入) 1.首先新建了一…

前端学习(1520):vue-router嵌套路由

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title></head> <!-- 1引入…

python与sql连接不上_Python连接不上SQL Server的两种根治思路

连接不上数据库&#xff0c;首先可以排除是代码的问题&#xff0c;连接方式都是千篇一律的。大多数问题都是本机的两个原因造成的&#xff0c;1.服务没有开启,2.没有启动SQL配置的TCP/IP下面给出统一解决方案&#xff1a;首先从开始菜单找到SQL数据库的配置工具&#xff0c;比如…

Bootstrap系列 -- 23. 图片

图像在网页制作中也是常要用到的元素&#xff0c;在Bootstrap框架中对于图像的样式风格提供以下几种风格&#xff1a; 1、img-responsive&#xff1a;响应式图片&#xff0c;主要针对于响应式设计  2、img-rounded&#xff1a;圆角图片  3、img-circle&#xff1a;圆形图片…

python多进程和多线程一起使用_Python:多进程和多线程

在现实社会&#xff0c;我们经常需要一种场景&#xff0c;就是同时有多个事情需要执行&#xff0c;如在浏览网页的同时需要听音乐。比如说在跳舞的时候要唱歌。同样的&#xff0c;在程序中我们也可能需要这种场景。如下面我们以同时听音乐和浏览网页为例。def network():while …

Java多线程异常处理

在java多线程程序中&#xff0c;所有线程都不允许抛出未捕获的checked exception&#xff0c;也就是说各个线程需要自己把自己的checked exception处理掉。这一点是通过java.lang.Runnable.run()方法声明(因为此方法声明上没有throws exception部分)进行了约束。但是线程依然有…

python字典怎么换行_Python字典如何换行

原标题&#xff1a;Python字典如何换行Python字典换行的方法如下&#xff1a;1、换行时保证行尾是逗号即可a {"key0": "val0","key1": "val1","key2": "val2"}2、在长度不影响阅读的情况下这种写法也是允许的&am…

回复《我要阻止做java开发的男朋友去创业型公司工作吗?》园友问题

真的非常开心能收到这么多园友的关心&#xff0c;看到这么多的回复顿感身边处处充满爱。也非常感谢大家踊跃的帮我出谋划策&#xff0c;小女子在此有礼了&#xff01; 我先来回答一下性别的问题&#xff08;前面已经暴露了……&#xff09;&#xff0c;我是前端程序媛。大三时和…

java date转sql date_java.util.Date和java.sql.Date转换(转)

Date 的类型转换&#xff1a;首先记住java.util.Date 为 java.sql.Date的父类1.将java.util.Date 转换为 java.sql.Datejava.lang.ClassCastException: java.util.Date cannot be cast to java.sql.DateDate dnew Date(); //java.util.Datenew java.sql.Date(d.getTime()) //…