Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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 如何将类表示为函数?_Python_Django_Function_Oop_Python Rq - Fatal编程技术网

Python 如何将类表示为函数?

Python 如何将类表示为函数?,python,django,function,oop,python-rq,Python,Django,Function,Oop,Python Rq,由于之前不清楚,我发布了以下场景: class Scraper: def __init__(self,url): self.start_page = url def parse_html(self): pass def get_all_links(self): pass def run(self): #parse html, get all links, parse them and when done...

由于之前不清楚,我发布了以下场景:

class Scraper:
    def __init__(self,url):
      self.start_page = url

    def parse_html(self):
      pass

    def get_all_links(self):
      pass

    def run(self):
      #parse html, get all links, parse them and when done...
      return links
现在在像rq这样的任务队列中

from rq import Queue
from worker import conn

q = Queue(connection=conn)
result = q.enqueue(what_function, 'http://stackoverflow.com')
我想知道这个函数是什么?我记得Django对他们的CBV做了一些类似的事情,所以我用了这个比喻,但并不清楚

我有一门课

class A:
    def run(self,arg):
        #do something
我需要将其传递到任务队列,这样我就可以执行以下操作

a = A()
b = a.run
# q is the queue object
q.enqueue(b,some_arg)
我想知道还有什么其他方法可以做到这一点,例如,Django在他们基于类的视图中做到这一点

class YourListView(ListView):
    #code for your view
最终作为函数传递

your_view = YourListView.as_view()
怎么做的

编辑:为了详细说明,django基于类的视图被转换为函数,因为模式函数中的参数需要函数。类似地,您可能有一个接受以下参数的函数

task_queue(callback_function, *parameters):
    #add to queue and return result when done

但是callback_函数的功能可能主要是在类中实现的,该类有一个运行过程的run方法。

我认为您描述的是一个classmethod:

dict.fromkeys(['foo', 'bar'])
可以这样使用:

call_later = MyClass.as_view
class Scraper:
    def __init__(self,url):
        self.start_page = url

    def parse_html(self):
        pass

    def get_all_links(self):
        pass

    @classmethod
    def run(cls, url):
        instance = cls(url)
        #parse html, get all links, parse them and when done...
        return links
后来被称为:

call_later()
最常见的是,类方法用于实例化新实例,例如dict的fromkeys类方法:

dict.fromkeys(['foo', 'bar'])
返回新的dict实例:

{'foo': None, 'bar': None}
使现代化 以你为例,

result = q.enqueue(what_function, 'http://stackoverflow.com')
你想知道什么函数可以用到那里。我在RQ主页上看到了一个非常类似的例子。这必须是你自己的实现。你可以用你的代码调用它。它只会被该参数调用一次,因此如果使用类,您的_init _uu应该更像这样,如果您想使用Scraper替换what_函数:

class Scraper:
    def __init__(self,url):
        self.start_page = url
        self.run()
        # etc...
如果要使用类方法,可能如下所示:

call_later = MyClass.as_view
class Scraper:
    def __init__(self,url):
        self.start_page = url

    def parse_html(self):
        pass

    def get_all_links(self):
        pass

    @classmethod
    def run(cls, url):
        instance = cls(url)
        #parse html, get all links, parse them and when done...
        return links

然后你的what_函数将是Scraper.run.

什么意思,将类作为函数呈现?我不理解你的问题。您的两个代码示例看起来完全不同。请澄清您实际想要做什么。@AaronHall有些函数,如rq中的任务队列,需要一个函数作为参数。但是,如果您已经用oop编写了大部分代码,那么您可能希望最终将其作为一个函数呈现,以便能够将其传递到队列中。我认为您需要的是一个类方法。看,如果不是这样,回来再补充一些细节。@AaronHall哦,你刚才也给了我答案!!:好的,假设MyClass有一个属性val,我有两个对象,a=MyClass'a'和b=MyClass'b',这样a.val='a'和b.val='b'现在,如果class方法使用类的val属性,它会使用哪一个?@yayu都不会,除非您为类命名空间提供一个类变量,否则会有AttributeError,例如,紧挨着类MyClassobject:您有val=None或其他一些值,将变量val放入类的命名空间中。