类变量拒绝通过“ self”工作,但使用类名(Python)

时间:2019-11-04 07:35:29

标签: python-3.x class class-variables

我有一个简单的类,并且在该类中有一个类变量:

class QuotesToScrape:

    authors_list = []

    def __init__:

此类中的方法中有一行代码(从 init 调用方法):

def gather_authors_list(self):
    self.authors_list = some_value

此行不起作用,变量authors_list仍然为空。但是,如果我将“ self”更改为类名,则效果很好:

def gather_authors_list(self):
    QuotesToScrape.authors_list = some_value

未使用装饰器。我觉得这里是一些我需要理解的重要技巧,可以防止将来出现严重的问题。

稍后添加。重要部分:我还有另一个类变量“ quotes”,它工作正常。这几乎是我的代码的完整片段。类变量“ quotes”可以,类变量“ authors_list”不可以。

class QuotesToScrape:

    quotes = []         
    authors_list = []   

    def __init__(self):
        for page_number in range(1, 501):
            page_url = self.make_page_url(page_number)
            soup = self.get_soup(page_url)
            if self.out_of_quotes(soup):
                break
            quote_blocks = self.parse_quotes(soup)
            for quote_block in quote_blocks:self.quotes
                quote = self.extract_quote(quote_block)
                self.quotes.append(quote)
        self.gather_authors_list()

...

    def gather_authors_list(self):
        authors = list(set([quote.get('Author') for quote in self.quotes]))
        if 'Alexandre Dumas fils' in authors:
            duma_index = authors.index('Alexandre Dumas fils')
            authors[duma_index] = 'Alexandre (fils) Dumas'
        self.authors_list = sorted(authors, key = lambda x: x.split(" ")[-1])

稍后添加。问题解决了。更改了最后一行以匹配注释的方向。这解决了我的问题,现在方法不会创建新变量,而是使用现有的空类变量:

self.authors_list.extend(sorted(authors, key = lambda x: x.split(" ")[-1]))

2 个答案:

答案 0 :(得分:0)

有问题的版本后编辑:当您说self.authors_list = ...时,类变量没有得到更新,而是创建了一个新的对象变量,并且该变量仅可用于该类实例。对于quotes,您要进行任何赋值,而是要执行一个追加,该追加会反映在类变量quotes中。

相反,当您执行QuotesToScrape.authors_list时,您更改了类变量,这反映在以后创建的其他对象实例中。

尝试通过以下示例了解您的情况:

class Yes:
    a = 1
    def __init__(self):
        pass

    def yes(self):
        if Yes.a==1:
            print "Yes"
        else:
            print "No, but yes"

class No(Yes):

    def no(self):
        if Yes.a==1:
            print "No"
        else:
            print "Yes, but no"
        Yes.a-=1 #Note this line

Yes().yes()
No().no()
Yes().yes()
No().no()

答案是:

Yes().yes()
No().no()
Yes().yes()
No().no()

我希望通过本示例可以帮助您理解类变量的知识。如果您有任何疑问,请告诉我。 :)

答案 1 :(得分:0)

问题是您的代码创建了两个变量:

该类的名称空间中的一个

class QuotesToScrape:

    authors_list = []

和另一个在对象名称空间中。

def gather_authors_list(self):
    self.authors_list = some_value

变量是通过python中的赋值定义的。所以在哪里分配它们很重要。

请注意,从对象实例通过self,您仍然可以到达类变量:如果在对象的名称空间中找不到该变量,则在类的名称空间(和超类)中查找该名称。