Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 必须以实例作为第一个实例调用Unbound方法_Python_Class - Fatal编程技术网

Python 必须以实例作为第一个实例调用Unbound方法

Python 必须以实例作为第一个实例调用Unbound方法,python,class,Python,Class,因此,我有一个类,其中一个类变量被设置为\uuu init\uu方法中类工厂的输出,如下所示: def MyFooFactory(): def __init__(self, *args): # Do __init__ stuff def MyBar(myFoo_obj): print "MyBar" newclass = type("MyFoo", tuple(object), {"__init__": __init__, "MyBar

因此,我有一个类,其中一个类变量被设置为
\uuu init\uu
方法中类工厂的输出,如下所示:

def MyFooFactory():
    def __init__(self, *args):
        # Do __init__ stuff

    def MyBar(myFoo_obj):
        print "MyBar"

    newclass = type("MyFoo", tuple(object), {"__init__": __init__, "MyBar": MyBar} )
    return newclass

class Foo:
    Bar = 0
    def __init__(self):
        if (type(Foo.Bar) is int):
            Bar = MyFooFactory()

    def MyBar(a_list):
        for l in a_list:
            Bar.MyBar(l)
然而,当我尝试这个

myBar_list = [Foo.Bar() for _ in range(x)]
Foo.MyBar(myBar_list)
TypeError:必须以Foo实例作为第一个参数调用未绑定的方法MyBar()(改为Get list)

发生这种情况是因为
MyBar
Foo
MyFoo
中都有相同的名称,还是有其他原因

作为参考,这两个
MyBar
方法都应该是未绑定的


谢谢,

这是因为您忘记了
MyBar中的
self
参数

试试这个:

class Foo:
    ...

    def MyBar(self, a_list):
        for l in a_list:
            Bar.MyBar(l)
如果它应该是“unbound”方法,请使用
@staticmethod

语句

Bar = MyFooFactory()
正在分配一个本地成员,而不是在
Foo.MyBar

如果要在方法中指定该值,则语法为

Foo.Bar = MyFooFactory()

类主体中的作用域规则有些令人惊讶。

Python中的实例方法必须将
self
作为第一个参数(其中
self
与其他任何参数一样,实际上只是一个正式的参数名-它由于是第一个参数而绑定到实例),因此

def MyBar(self, a_list):
    ...
另一方面,如果确实需要静态方法,则必须:


也可以看到这个答案:

我没有忘记它,它应该是一个未绑定的方法。我明白了!这就是我做错的地方。那么,我该如何分配类级别
Bar
class Foo:\n Bar=myfoodfactory
(在
\uuu init\uuuu
方法之外)应该做你想做的事情。那么,如果我写
Foo.Bar=myfoodfactory()
的话,这会起作用吗?你可以在类定义里面做(见@6502答案下面的注释)。
@staticmethod
def MyBar(a_list):
    ...