gpt4 book ai didi

python - instancemethod装饰器在哪里?

转载 作者:行者123 更新时间:2023-11-28 17:53:26 25 4
gpt4 key购买 nike

在我的代码中,我有一个返回类实例的方法,如下所示:

class MyClass:
def fun( self, *args ): # the method
return Props( self, *args )

class Props: # the returned object
def __init__( self, parent, *args ):
self.parent = parent
self.args = args

为了让事情井井有条,我正在考虑将 Props 放在 MyClass 中。然后我想绕过 fun 并直接使该类成为 MyClass 的实例方法,如下所示:

class MyClass:
@instancemethod # does not exist!
class fun:
def __init__( self, parent, *args ):
self.parent = parent
self.args = args

注意注释 - instancemethod 装饰器不存在。

有没有办法做到这一点,即把一个可调用对象变成一个实例方法?如果我将@instancemethod 更改为@classmethod,则构造工作正常,当然父级是类,而不是实例。令我惊讶的是,我找不到任何关于似乎是相反操作的信息。

很想把这个弄清楚!

编辑:

看来我的问题没说清楚。我拥有的是一个成员函数 fun,它返回的不是单个值或元组,而是一个充满数据的对象。此数据是根据 MyClass 对象和函数参数的内容生成的。我的初始代码完全符合我的要求。第二个代码是我更喜欢的编写方式。

此外,我注意到我正在寻找的装饰器如下:

def instancemethod( cls ):
def f( *args ):
return cls( *args )
return f

当然,它与我旨在绕过的“有趣”方法相同。另请注意,琐碎的“return cls”并不完全相同,尽管乍一看似乎是这样。

使用这个装饰器,我的第二个类定义是有效的并产生了期望的结果,即 a.fun() 返回一个对象,该对象(可能)根据 a 中的数据初始化:

a = MyClass()
p = a.fun(1,2,3)

print a # <__main__.MyClass instance at 0xb775b84c>
print p.parent # <__main__.MyClass instance at 0xb775b84c>
print p.args # (1, 2, 3)

这仍然留给我一个问题,如果这里定义的 instancemethod 不能用作 python 内置函数,因为它似乎是 classmethod 和 staticmethod 旁边的一个遗漏。但是,如果不是,我想我可以接受这种结构。

最佳答案

我不确定你到底想做什么,但我怀疑你想继续阅读 descriptors .

基本上,描述符是一个类的属性,该类本身是一个定义了 __get____set__ 方法的类。在你的情况下,你可以将代码从 Props.__init__ 移动到 Props.__set__,将 Props 设置为 fun 类的属性,一切都应该按照您的意愿工作。

关于python - instancemethod装饰器在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5632595/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com