将模块方法分配给 Class 变量或实例变量
Assign module method to a Class variable or Instance variable
在模块 a.py
def task():
print "task called"
a = task
class A:
func = task # this show error unbound method
#func = task.__call__ # if i replace with this work
def __init__(self):
self.func_1 = task
def test_1(self):
self.func_1()
@classmethod
def test(cls):
cls.func()
a()
A().test_1()
A.test()
输出:
task called
task called
Traceback (most recent call last):
File "a.py", line 26, in <module>
A.test()
File "a.py", line 21, in test
cls.func()
TypeError: unbound method task() must be called with A instance as
first argument (got nothing instead)
在模块中,我可以轻松地将一个函数赋值给一个变量。当在 class 中尝试将模块级函数分配给 class 变量 func = task 它显示错误,要删除此错误我必须将其替换为 func = task.__call__ 但是当我将它的工作分配给实例变量时 self.func_1 = task。
我的问题是:为什么我不能在没有 __call__ 的情况下将模块级函数分配给 class 变量,而当我可以分配相同的函数时分配给实例变量正在工作。
因为您将一个函数映射为 A
的未绑定方法,所以当您调用 cls.func
时,您首先会询问等于 getattr(cls, 'func')
的内容 returns <unbound method A.task>
但是,需要使用 class 作为第一个参数调用此未绑定方法。
所以因为在这种特定情况下 cls.func
意味着 "gives me class attribute func
of cls
" 它不能同时意味着 "call class method func
" - 所以 Python 不翻译 cls.func()
func(cls)
.
但同时,因为func
是<unbound method A.task>
(绑定到A.task
)所以需要像func(cls)
那样调用才能工作。
用类似的东西检查它:
@classmethod
def test(cls):
print getattr(cls, 'func') # <unbound method A.task>
你可以用类似的东西修复它:
def task(cls=None):
if cls is None:
print 'task()'
else:
print 'A.foo({})'.format(cls)
a = task
class A:
func = task # this show error unbound method
def __init__(self):
self.func_1 = task
def test_1(self):
self.func_1()
@classmethod
def test(cls):
cls.func(cls())
a()
A().test_1()
A.test()
输出:
task()
task()
A.foo(<__main__.A instance at 0x7fd0310a46c8>)
注意 python3 删除未绑定的方法,这仅适用于 python2.x
在模块 a.py
def task():
print "task called"
a = task
class A:
func = task # this show error unbound method
#func = task.__call__ # if i replace with this work
def __init__(self):
self.func_1 = task
def test_1(self):
self.func_1()
@classmethod
def test(cls):
cls.func()
a()
A().test_1()
A.test()
输出:
task called
task called
Traceback (most recent call last):
File "a.py", line 26, in <module>
A.test()
File "a.py", line 21, in test
cls.func()
TypeError: unbound method task() must be called with A instance as
first argument (got nothing instead)
在模块中,我可以轻松地将一个函数赋值给一个变量。当在 class 中尝试将模块级函数分配给 class 变量 func = task 它显示错误,要删除此错误我必须将其替换为 func = task.__call__ 但是当我将它的工作分配给实例变量时 self.func_1 = task。
我的问题是:为什么我不能在没有 __call__ 的情况下将模块级函数分配给 class 变量,而当我可以分配相同的函数时分配给实例变量正在工作。
因为您将一个函数映射为 A
的未绑定方法,所以当您调用 cls.func
时,您首先会询问等于 getattr(cls, 'func')
的内容 returns <unbound method A.task>
但是,需要使用 class 作为第一个参数调用此未绑定方法。
所以因为在这种特定情况下 cls.func
意味着 "gives me class attribute func
of cls
" 它不能同时意味着 "call class method func
" - 所以 Python 不翻译 cls.func()
func(cls)
.
但同时,因为func
是<unbound method A.task>
(绑定到A.task
)所以需要像func(cls)
那样调用才能工作。
用类似的东西检查它:
@classmethod
def test(cls):
print getattr(cls, 'func') # <unbound method A.task>
你可以用类似的东西修复它:
def task(cls=None):
if cls is None:
print 'task()'
else:
print 'A.foo({})'.format(cls)
a = task
class A:
func = task # this show error unbound method
def __init__(self):
self.func_1 = task
def test_1(self):
self.func_1()
@classmethod
def test(cls):
cls.func(cls())
a()
A().test_1()
A.test()
输出:
task()
task()
A.foo(<__main__.A instance at 0x7fd0310a46c8>)
注意 python3 删除未绑定的方法,这仅适用于 python2.x