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放入类的命名空间中。