当前位置: 首页 > 面试题库 >

创建同时是实例和类方法的方法

常彭薄
2023-03-14
问题内容

在Python中,我希望能够创建一个既充当类函数又充当实例方法的函数,但是具有更改行为的能力。用例是针对一组可序列化的对象和类型。举个例子:

>>> class Thing(object):
    #...
>>> Thing.to_json()
'A'
>>> Thing().to_json()
'B'

我知道给定Python源中funcobject.c中classmethod()的定义,这看起来像使用C模块一样简单。有没有办法从python内部执行此操作?

谢谢!

有了描述符的提示,我可以使用以下代码来做到这一点:

class combomethod(object):
    def __init__(self, method):
        self.method = method

    def __get__(self, obj=None, objtype=None):
        @functools.wraps(self.method)
        def _wrapper(*args, **kwargs):
            if obj is not None:
                return self.method(obj, *args, **kwargs)
            else:
                return self.method(objtype, *args, **kwargs)
        return _wrapper

谢谢亚历克斯!


问题答案:

当然,您只需要定义自己的 描述符
类型。有Python的描述符的优秀教程这里。



 类似资料:
  • 问题内容: 我希望能够通过在已实例化的对象上调用方法来创建对象的新实例。例如,我有一个对象: 我希望能够调用并拥有两个有机体类型的对象。此时我的方法如下所示: 并且我非常确定它不起作用(我甚至不确定如何测试它。我在本文中尝试了gc方法)。那么,如何使我的对象创建自己的副本,就像我创建的第一个对象(带有)一样,该副本是可访问的? 问题答案: 另一个选项-如果方法中未使用实例(): 这样可以确保生物产

  • 问题 你想创建类和实例的方法。 解决方案 类方法 class Songs @_titles: 0 # Although it's directly accessible, the leading _ defines it by convention as private property. @get_count: -> @_titles constructor: (@

  • 问题内容: 我有点困惑。问题是标题,这就是为什么我要问。我在单个VM上运行了JSF + JPA Web应用程序。JPA类具有字段。现在想象一下某个网络用户打开了一个页面并执行以下代码 当另一个Web用户/线程尝试读取该瞬态值时,我期望什么输出: 换句话说,就JVM而言,方法是否总是返回新的类实例或相同或“取决于”的实例?我一直在通过JSR-220寻找答案,但没有成功,任何帮助或文档参考都将不胜感激

  • 本文向大家介绍php创建类并调用的实例方法,包括了php创建类并调用的实例方法的使用技巧和注意事项,需要的朋友参考一下 PHP类定义 PHP 定义类通常语法格式如下: 解析如下: 类使用 class 关键字后加上类名定义。 类名后的一对大括号({})内可以定义变量和方法。 类的变量使用 var 来声明, 变量也可以初始化值。 函数定义类似 PHP 函数的定义,但函数只能通过该类及其实例化的对象访问

  • 主要内容:Python类实例方法,Python类方法,Python类静态方法和类属性一样,类方法也可以进行更细致的划分,具体可分为 类方法、 实例方法和 静态方法。 和类属性的分类不同,对于初学者来说,区分这 3 种类方法是非常简单的,即采用 @classmethod 修饰的方法为类方法;采用 @staticmethod 修饰的方法为静态方法;不用任何修改的方法为实例方法。 其中 @classmethod 和 @staticmethod 都是函数装饰器,后续章节会对其做详

  • 本文向大家介绍Ruby类实例变量、类实例方法和类变量、类方法的区别,包括了Ruby类实例变量、类实例方法和类变量、类方法的区别的使用技巧和注意事项,需要的朋友参考一下 在Ruby中类实例变量、类实例方法和类变量、类方法的区别比较微妙,而且用法也有相当的区别。本文探讨一下他们的定义和基本的使用场景,以抛砖引玉...   一.类实例变量和类变量   类变量大家都很熟悉了,就是在类定义中用@@开头的变量