gpt4 book ai didi

Python:如果静态类变量获得不同的函数引用指针,如何修复?

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:18 25 4
gpt4 key购买 nike

我想知道为什么我的类使用参数调用引用函数(分配给静态类变量)。如果我将函数引用分配给一个普通的类变量,它会像预期的那样工作。

这里是我的示例代码:

# This function is not editable, because it's imported from an API
def getStuff():
print "I do my stuff!!!"

class foo(object):
GET_STUFF = getStuff

def __init__(self):
print "static var: ",self.GET_STUFF
self.GET_STUFF()

print "outer func: ",getStuff
foo()

出现以下错误:

outer func:  <function getStuff at 0x0000000003219908>
static var: <bound method foo.getStuff of <__main__.foo object at 0x00000000030AB358>>
Traceback (most recent call last):
File "C:/example.py", line 13, in <module>
foo()
File "C:/example.py", line 10, in __init__
self.GET_STUFF()
TypeError: getStuff() takes no arguments (1 given)

为了解决这个问题,我将构造函数中的函数引用指向类变量:

class foo(object):
def __init__(self):
self.GET_STUFF = getStuff
print "static var: ",self.GET_STUFF
self.GET_STUFF()

结果如预期且工作正常:

outer func:  <function getStuff at 0x000000000331F908>
static var: <function getStuff at 0x000000000331F908>
I do my stuff!!!

但是:

我想使用一个静态类变量,因为它可以让不同的 API 易于阅读和设置。所以最后我会想出一些包装类,如下所示:

from API01 import getStuff01
from API02 import getStuff02

# bar calculates stuff object from the API (it calls GET_STUFF)
# and stores the object into self.stuff
import bar

class foo01(bar):
GET_STUFF = getStuff01

def DoSomething(self, volume):
self.stuff.volume = volume

class foo02(bar):
GET_STUFF = getStuff02

def DoSomething(self, volume):
self.stuff.volume = volume

# [...] and so on..

有没有办法让它以我想要设置包装类的方式工作,或者我真的必须为每个包装类定义一个构造函数吗?

谢谢

最佳答案

错误的原因是

self.GET_STUFF()

实际上是指

tmp = getattr(self, 'GET_STUFF')
tmp(self)

这意味着这两个类是等价的:

def foo(self): pass

class Foo(object):
a = foo

class Bar(object):
def a(self): pass

在这两种情况下,函数对象都作为成员添加到类中,这对于 Python 来说意味着函数需要 self 作为第一个参数。

实现你想要的:

from API01 import getStuff01

def wrapper01(self):
getStuff01()

class foo01(object):
GET_STUFF = wrapper01

关于Python:如果静态类变量获得不同的函数引用指针,如何修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29148328/

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