为什么在Python中跨类继承属性?
显然,我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在它移动到一个新文件时启动该集合(它不这样做)。按照我破解下面代码的方式,我希望它每次为为什么在Python中跨类继承属性?,python,class,attributes,Python,Class,Attributes,显然,我在学习如何正确使用课堂上遇到了一些困难。我希望下面的代码循环遍历一组文件(确实如此),在一个集合中添加元素(确实如此),并在它移动到一个新文件时启动该集合(它不这样做)。按照我破解下面代码的方式,我希望它每次为file.terminals返回一个空集,因为我相信每个集合都是类SrcFile的新实例的唯一属性。显然,我错了。实际发生的情况是,第一个文件创建的终端集对于列表中的所有后续文件都会保留(并添加到),尽管其他属性(例如,file.name,file.seqlength())会随文件
file.terminals
返回一个空集,因为我相信每个集合都是类SrcFile
的新实例的唯一属性。显然,我错了。实际发生的情况是,第一个文件创建的终端集对于列表中的所有后续文件都会保留(并添加到),尽管其他属性(例如,file.name
,file.seqlength()
)会随文件而相应更改。有人能解释一下为什么它是这样工作的,以及我如何创造出我所期望的行为吗?提前感谢您对初级程序员无知的耐心
class SrcFile:
terminals = set([])
def __init__(self, which):
self.name = which
def seqlength(self):
with open(self.name) as file:
linecounter = 0
for line in file:
linecounter += 1
if linecounter == 3:
return int(line.split()[0])
break
class Record(SrcFile):
def terminal(self):
record = self.name
def terminal(self):
record = self.name
return record.split()[0]
for f in files:
file = SrcFile(f)
print(file.name, file.seqlength(), file.terminals)
with open(f) as f:
recordline = re.compile(r"^([A-Z]{5})\s{3}")
for line in f:
if recordline.match(line):
record = Record(line)
if record.terminal() in file.terminals:
pass
else:
file.terminals.add(record.terminal())
通过在类本身中定义
terminals=set([])
,在定义类时创建一次,而不是在创建实例时创建一次
要避免这种情况,请将其删除并将以下内容添加到\uuuu init\uuu
方法中:
self.terminals = set()
您是在类声明中定义
终端
,而不是在为类的每个新实例执行的\uuu init\uuuu
函数中
基本上,终端
针对整个类进行初始化,而不是针对类的每个实例:
>>> SrcFile.terminals
set([])
注意,我运行了SrcFile.terminals
,而不是SrcFile().terminals
,这意味着SrcFile
是类的引用,而不是类的实例
您可以在\uuuu init\uuuu
函数中放置类似的变量,使其特定于实例:
class SrcFile(object):
def __init__(self, which):
self.name = which
self.terminals = set([])
谢谢这就解决了问题。我真的很感谢这个论坛对我们这些刚刚开始的人的耐心。明白了…有很多东西要学。接受提交的第一个正确答案并签字。重定向到此处