如何在 Python 2.7 中用另一个类修饰实例方法?

2023-12-01

在Python 2.7中我想装饰一个实例方法test在班上Foo带有一个装饰器,它也是一个名为FooTestDecorator。来自用户 Chirstop 的question和 Python 2 文档'描述符操作指南我创建了这个例子。

然而,似乎有一个问题,当我打印我的装饰方法对象时,它的(检查?)名称是错误的,因为它被标记为问号,例如Foo.?.

import types
class FooTestDecorator(object):
    def __init__(self,func):
        self.func=func
        self.count=0
        # tried self.func_name = func.func_name, but seemed to have no effect

    def __get__(self,obj,objtype=None):
        return types.MethodType(self,obj,objtype)
    def __call__(self,*args,**kwargs):
        self.count+=1
        return self.func(*args,**kwargs)

class Foo:
    @FooTestDecorator
    def test(self,a):
        print a
    def bar(self,b):
        print b

如果你测试它:

f=Foo()
print Foo.__dict__['test']
print Foo.test
print f.test
print Foo.__dict__['bar']
print Foo.bar
print f.bar

you get

<__main__.FooTestDecorator ...object...>
<unbound method Foo.?>
<bound method Foo.? of ...instance...>
<function bar at 0x...>
<unbound method Foo.bar>
<bound method Foo.bar of ...instance...>

可以看到替换方法如图Foo.?。这似乎是错误的。

如何获得正确的类装饰实例方法?

注意:我的原因是我想使用来自FooDecorator实例的self我会在 init 中设置它。为了简单起见,我没有将其放在示例中。


你的装饰器实例没有__name__属性,所以 Python 必须用问号来代替。

Use functools.update_wrapper()复制函数名称,加上一些其他有趣的特殊属性(例如文档字符串、函数模块名称和函数可能具有的任何自定义属性):

import types
from functools import update_wrapper

class FooTestDecorator(object):
    def __init__(self,func):
        self.func=func
        self.count=0
        update_wrapper(self, func)

    def __get__(self,obj,objtype=None):
        return types.MethodType(self,obj,objtype)
    def __call__(self,*args,**kwargs):
        self.count+=1
        return self.func(*args,**kwargs)

Demo:

>>> f=Foo()
>>> print Foo.__dict__['test']
<__main__.FooTestDecorator object at 0x11077e210>
>>> print Foo.test
<unbound method Foo.test>
>>> print f.test
<bound method Foo.test of <__main__.Foo instance at 0x11077a830>>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Python 2.7 中用另一个类修饰实例方法? 的相关文章

  • Sublime Text 插件开发中的全局 Python 包

    一 总结 我不知道 Sublime Text 插件开发人员如何使用 Sublime Text 查找全局 Python 包 而不是 Sublime Text 目录的 Python 包 Sublime Text使用自己的Python环境 而不是
  • 用缺失的日期填充其他列 Nan Pandas DataFrame

    我实际上是从几个 Excel 文件中提取数据来监控我的每日卡路里摄入量 我设法使用列表理解来生成日期 我尝试使用合并或连接 但它不起作用 ValueError 您正在尝试合并对象和 float64 列 date list 2021 05 2
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 工作日重新订购 Pandas 系列

    使用 Pandas 我提取了一个 CSV 文件 然后创建了一系列数据来找出一周中哪几天崩溃最多 crashes by day bc DAY OF WEEK value counts 然后我将其绘制出来 但当然它按照与该系列相同的排名顺序绘制
  • Python3.0 - 标记化和取消标记化

    我正在使用类似于以下简化脚本的内容来解析较大文件中的 python 片段 import io import tokenize src foo bar src bytes src encode src io BytesIO src src l
  • 在 Django OAuth Toolkit 中安全创建新应用程序

    如何将 IsAdminUser 权限添加到 Django OAuth Toolkit 中的 o applications 视图 REST FRAMEWORK DEFAULT PERMISSION CLASSES rest framework
  • 一段时间后终止线程的最 Pythonic 方法

    我想在线程中运行一个进程 它正在迭代一个大型数据库表 当线程运行时 我只想让程序等待 如果该线程花费的时间超过 30 秒 我想终止该线程并执行其他操作 通过终止线程 我的意思是我希望它停止活动并优雅地释放资源 我认为最好的方法是通过Thre
  • pytest:同一接口的不同实现的可重用测试

    想象一下我已经实现了一个名为的实用程序 可能是一个类 Bar在一个模块中foo 并为其编写了以下测试 测试 foo py from foo import Bar as Implementation from pytest import ma
  • 使用 python 绘制正值小提琴图

    我发现小提琴图信息丰富且有用 我使用 python 库 seaborn 然而 当应用于正值时 它们几乎总是在低端显示负值 我发现这确实具有误导性 尤其是在处理现实数据集时 在seaborn的官方文档中https seaborn pydata
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • Geodjango距离查询未检索到正确的结果

    我正在尝试根据地理位置的接近程度来检索一些帖子 正如您在代码中看到的 我正在使用 GeoDjango 并且代码在视图中执行 问题是距离过滤器似乎被完全忽略了 当我检查查询集上的距离时 我得到了预期距离 1m 和 18km 但 18km 的帖
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • 动态过滤 pandas 数据框

    我正在尝试使用三列的阈值来过滤 pandas 数据框 import pandas as pd df pd DataFrame A 6 2 10 5 3 B 2 5 3 2 6 C 5 2 1 8 2 df df loc df A gt 0
  • Python SSL X509:KEY_VALUES_MISMATCH

    Python HTTPS server from http server import HTTPServer SimpleHTTPRequestHandler import ssl https stackoverflow com a 408
  • 混淆矩阵不支持多标签指示符

    multilabel indicator is not supported是我在尝试运行时收到的错误消息 confusion matrix y test predictions y test is a DataFrame其形状为 Horse
  • 双击打开 ipython 笔记本

    相关文章 通过双击 osx 打开 ipython 笔记本 https stackoverflow com questions 16158893 open an ipython notebook via double click on osx
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 使用ssl和socket的python客户端身份验证

    我有一个 python 服务器 需要客户端使用证书进行身份验证 我如何制作一个客户端脚本 使用客户端证书由 python 中的服务器使用 ssl 和套接字模块进行身份验证 有没有仅使用套接字和 ssl 而不扭曲的示例 from OpenSS
  • 查找总和为给定数字的值组合的函数

    这个帖子查找提供的 Sum 值的组合 https stackoverflow com a 20194023 1561176呈现函数subsets with sum 它在数组中查找总和等于给定值的值的组合 但由于这个帖子已经有6年多了 我发这

随机推荐

  • 如何在android中方向改变时继续视频播放

    我使用 videoview 在 android 默认播放器中播放视频 当我改变它的方向时 它从头开始播放 我怎样才能让它从方向改变的那一点继续下去 Add
  • 代码隐藏检查以查看控件是否已设置为显示:无?

    我目前有一个隐藏在我的服务器端的控件dropdown hide hide 是我创建的用于隐藏我的方法的服务器端方法 例如 control Style display none 在服务器端如何判断我的控件是否隐藏 我猜你的意思不仅仅是做 if
  • 无法使用preparedStatement创建表

    我无法使用以下命令在数据库 mySQL 中创建表preparedStatement并尝试输入未来表的名称preparedStatement setInteger static String queryCreateTable CREATE T
  • 在 ReportNG 中未获取 TestNG 的报告

    我正在 eclipse 中执行 testng 我想在 reportNG 中生成报告 为此 我已经包含了 guice 3 0 reportng 1 1 3 velocity dep 1 4 jar 文件 并在 xml 文件中添加了侦听器 此外
  • jQuery 通过按钮 onclick 跳转或滚动到页面上的特定位置、div 或目标 [重复]

    这个问题在这里已经有答案了 当我单击按钮时 我希望能够向下跳转或滚动到页面上的特定 div 或目标 clickMe click function jump to certain position or div or target on th
  • 如何定义实例?

    我在面试中被问到一个问题 但我无法回答 这是问题 您将如何定义实例 c 我的回答是它是另一个名字object 这个问题的正确答案是什么 实例之于类 就像蛋糕之于菜谱一样 每当您使用构造函数创建对象时 您都在创建一个实例
  • 用于 WSDL 和 BasicHttpBinding 的 F# 类型提供程序

    当我在 C 中使用 WSDL 服务时 我可以将两个参数传递给构造函数 BasicHttpBinding 和 EndpointAddress BasicHttpBinding basicHttpBinding new BasicHttpBin
  • PHP Artisan Tinker 无法与 Laravel 5.5.16 一起使用

    我运行 php artisantinker 但它不起作用它只显示这样的消息 c xampp htdocs app tpa gt php artisan tinker 错误异常 rmdir C Users KIMUNG 1 AppData L
  • 如何使用 JavaScript Regex 提取字符串?

    我正在尝试使用 JavaScript 正则表达式从文件中提取子字符串 这是文件中的一个片段 DATE 20091201T220000 SUMMARY Dad s birthday 我要提取的字段是 摘要 方法如下 extractSummar
  • Mac Lion 10.8 的 XAMPP 上的 Php-intl 安装

    大家好 我正在尝试在 Mac 版 xampp 上安装 intl 库 我已经安装了 php 5 3 所以我只是将 intl so 文件从 php 5 3 位置复制到 Xampp bin 文件夹 之后我取消注释 extension intl s
  • Java 中的静态泛型字段

    我将通过传递通用字段 演示者 来实现片段的初始化 然后将此演示者连接到创建的视图 public class BaseViewFragment p extends Fragment implements BaseView static pri
  • 在 Access 查询中调用 VBA 函数

    我正在尝试将 8 个不同查询的结果合并回一个查询中 所有要使用的查询都是查询的查询的查询的查询的查询 8 个系列的 4 个查询根据玩家打了多少轮高尔夫球将他们分开 每个系列中的最后一个查询计算每个玩家的确切让分 我正在使用的代码可能无法实现
  • Python 脚本在运行过程中速度变慢?

    我正在运行一个具有以下基本结构的模拟 from time import time def CSV args write args to CSV file return def timeleft a L period print detail
  • 3D 游戏对象的级联效果(Tango、Unity、Android)

    我正在开始使用 Unity 为 Android 构建 Tango 应用程序 我以前有过 Unity 和 Android 经验 但对 Tango 还很陌生 我遵循了这些指南 https developers google com tango
  • 伯努利朴素贝叶斯在 NLTK 和 scikit-learn 中的结果不同

    使用 NLTK 中的伯努利朴素贝叶斯算法和 scikit learn 模块中的伯努利朴素贝叶斯算法对文本进行分类 仅分为两类 时 我得到了完全不同的结果 尽管两者的总体准确度相当 尽管远非相同 但 I 类和 II 类错误的差异很大 特别是
  • Neo4j:正确对螺栓驱动器进行单元测试

    我将 Neo4j Bolt 驱动程序添加到我的应用程序中 如下所示http neo4j com developer java import org neo4j driver v1 Driver driver GraphDatabase dr
  • 如何通过点击缩略图来显示/隐藏大图?

    如何通过点击缩略图来显示 隐藏大图 我需要这样 在这里尝试使用 JSFiddle http jsfiddle net jitendravyas Qhdaz 只用 CSS 可以吗 如果没有 那么 jQuery 解决方案就可以了 An好用吗 a
  • ms-access 内置函数 Month(number)

    我一直在使用访问查询生成器中的 Month 函数的变体 我无法从表达式构建日期值 我希望创建自己的日期 该日期将在幕后执行一些过滤和其他任务 我的问题是 我似乎无法让 Month number 函数执行我认为应该执行的操作 这是我正在寻找的
  • Python:如何使冒泡排序的实现更加省时?

    这是我的代码 用于按升序对列表元素进行排序的冒泡排序算法 foo 7 0 3 4 1 cnt 0 for i in foo for i in range len foo 1 if foo cnt gt foo cnt 1 temp foo
  • 如何在 Python 2.7 中用另一个类修饰实例方法?

    在Python 2 7中我想装饰一个实例方法test在班上Foo带有一个装饰器 它也是一个名为FooTestDecorator 来自用户 Chirstop 的question和 Python 2 文档 描述符操作指南我创建了这个例子 然而