Class 变量拒绝通过 "self" 工作,但使用 class 名称 (Python)
Class variable refuses to work via "self" but works with class name (Python)
我在这个 class:
中有一个简单的 class 和一个 class 变量
class QuotesToScrape:
authors_list = []
def __init__:
这个class里面的一个方法里有一行代码(方法是从init调用的):
def gather_authors_list(self):
self.authors_list = some_value
此行不起作用,变量 authors_list 仍然为空。但是,如果我将 "self" 更改为 class 名称,它就可以正常工作:
def gather_authors_list(self):
QuotesToScrape.authors_list = some_value
没有使用装饰器。我觉得这里有一些我需要了解的重要技巧,以防止我将来遇到严重问题。
稍后添加。重要部分:我有另一个 class 变量 "quotes",它工作得很好。这是我的代码的几乎完整片段。 Class 可变 "quotes" 正常,class 可变 "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])
稍后添加。问题解决了。更改了最后一行以匹配评论中的说明。这解决了我的问题,现在方法不创建新变量,而是使用现有的空 class 变量:
self.authors_list.extend(sorted(authors, key = lambda x: x.split(" ")[-1]))
在有问题的版本之后编辑:当你说 self.authors_list = ...
时,class 变量没有得到更新,而是创建了一个新的对象变量,并且它仅对 class 可用实例。在 quotes
的情况下,您正在执行任何赋值,而您执行的附加操作会反映在 class 变量 quotes
中。
当您执行 QuotesToScrape.authors_list
时,您更改了 class 变量,这会反映在您之后创建的其他对象实例中。
试着用这个例子来理解你的情况:
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()
我希望通过这个示例有助于理解您对 class 变量的了解。如果您有任何疑问,请告诉我。 :)
问题是您的代码创建了两个变量:
class' 命名空间中的一个
class QuotesToScrape:
authors_list = []
另一个在对象的命名空间中。
def gather_authors_list(self):
self.authors_list = some_value
变量由 python 中的赋值定义。因此,您将它们分配到哪里很重要。
请注意,从对象实例,通过 self
,您仍然可以到达 class 变量:如果在对象的命名空间中找不到,则在 class' 命名空间(和 superclasses')
我在这个 class:
中有一个简单的 class 和一个 class 变量class QuotesToScrape:
authors_list = []
def __init__:
这个class里面的一个方法里有一行代码(方法是从init调用的):
def gather_authors_list(self):
self.authors_list = some_value
此行不起作用,变量 authors_list 仍然为空。但是,如果我将 "self" 更改为 class 名称,它就可以正常工作:
def gather_authors_list(self):
QuotesToScrape.authors_list = some_value
没有使用装饰器。我觉得这里有一些我需要了解的重要技巧,以防止我将来遇到严重问题。
稍后添加。重要部分:我有另一个 class 变量 "quotes",它工作得很好。这是我的代码的几乎完整片段。 Class 可变 "quotes" 正常,class 可变 "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])
稍后添加。问题解决了。更改了最后一行以匹配评论中的说明。这解决了我的问题,现在方法不创建新变量,而是使用现有的空 class 变量:
self.authors_list.extend(sorted(authors, key = lambda x: x.split(" ")[-1]))
在有问题的版本之后编辑:当你说 self.authors_list = ...
时,class 变量没有得到更新,而是创建了一个新的对象变量,并且它仅对 class 可用实例。在 quotes
的情况下,您正在执行任何赋值,而您执行的附加操作会反映在 class 变量 quotes
中。
当您执行 QuotesToScrape.authors_list
时,您更改了 class 变量,这会反映在您之后创建的其他对象实例中。
试着用这个例子来理解你的情况:
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()
我希望通过这个示例有助于理解您对 class 变量的了解。如果您有任何疑问,请告诉我。 :)
问题是您的代码创建了两个变量:
class' 命名空间中的一个
class QuotesToScrape:
authors_list = []
另一个在对象的命名空间中。
def gather_authors_list(self):
self.authors_list = some_value
变量由 python 中的赋值定义。因此,您将它们分配到哪里很重要。
请注意,从对象实例,通过 self
,您仍然可以到达 class 变量:如果在对象的命名空间中找不到,则在 class' 命名空间(和 superclasses')