Python 如何选择正确的类(NameError)

Python 如何选择正确的类(NameError),python,python-3.x,class-variables,Python,Python 3.x,Class Variables,我一直在做一个项目,我想收集URL,然后我可以导入所有带有scraper类的模块,它应该将所有模块注册到列表中 我目前做了: import sys import tldextract class Scraper: scrapers = {} def __init_subclass__(scraper_class): Scraper.scrapers[scraper_class.url] = scraper_class # .url -> Unresol

我一直在做一个项目,我想收集URL,然后我可以导入所有带有scraper类的模块,它应该将所有模块注册到列表中

我目前做了:

import sys
import tldextract


class Scraper:
    scrapers = {}

    def __init_subclass__(scraper_class):
        Scraper.scrapers[scraper_class.url] = scraper_class # .url -> Unresolved attribute reference 'url' for class 'Scraper' 

    @classmethod
    def for_url(cls, url):
        k = tldextract.extract(url)
        return scrapers[k.domain]() #<-- Unresolved reference 'scrapers' 


class BBCScraper(Scraper):
    url = 'bbc.co.uk'

    def scrape(s):
        print(s)
        # FIXME Scrape the correct values for BBC
        return "Yay works!"


url = 'https://www.bbc.co.uk/'
scraper = Scraper.for_url(url)
scraper.scrape("yay")

我想知道如何选择正确的类,例如,如果URL是bbc,它应该进入BBCScraper类,然后我们调用scrape,它稍后将返回在特定网站上被刮取的值,就像您在
\uu init\u子类中所做的那样,或者使用
cls.scrapers

@classmethod
def for_url(cls, url):
    k = tldextract.extract(url)
    return Scraper.scrapers[k.domain]() 
    # or
    return cls.scrapers[k.domain]() 

至于第二个问题

  • 请在另一个问题中问这个问题
  • 请更好地解释你到底想做什么

  • 我将创建一个关于第二个问题的新问题。我认为它可能不适合这里。使用cls.scraper和scraper.scraper有什么区别?:)-当继承开始发挥作用时,其行为会有所不同。这可能会影响您,具体取决于第二个问题。我认为对于这个特定的用例,这并不重要。
    @classmethod
    def for_url(cls, url):
        k = tldextract.extract(url)
        return Scraper.scrapers[k.domain]() 
        # or
        return cls.scrapers[k.domain]()