我在使用Python的re模块创建类的实例时遇到了麻烦。这就是我想要做的事情:
我希望以下代码片段能够在re
方法中为记录类打印由terminal()
模块捕获的五个大写字母的字符串,但显然我误解了一些东西。实际输出位于代码下方。
class SrcFile:
def __init__(self, which):
self.name = which
class Record(SrcFile):
def terminal(self):
recordline = re.compile(r"^([A-Z]{5})\s{3}")
if recordline.match(self):
m = recordline.match(self)
return m.group(1)
for f in files:
file = SrcFile(f)
for l in f:
record = Record(f)
print(record.terminal())
同样,我希望每条记录行看到一个包含五个大写字母的字符串,但实际上我得到的是:
Traceback (most recent call last):
File "./next.py", line 78, in <module>
print(record.terminal())
File "./next.py", line 63, in terminal
if recordline.match(self):
TypeError: expected string or buffer
如果有人能够在代码
中解释原因,也会有所帮助for f in files:
file = SrcFile(f)
for l in f:
record = Record(f)
使用record = Record(file)
显然不正确。我通过反复试验发现了这一点,因为我无法使用带有错误代码的record.method()来访问SrcFile类的方法,但我不明白为什么。
我确信我在编程方面缺乏经验,特别是Python的经验非常明显。在此先感谢您的帮助。
答案 0 :(得分:5)
你的意思是写
if recordline.match(self.name):
而不是
if recordline.match(self):
当您致电re.match
时,您应该使用字符串进行调用。 self
不是字符串,而是Record
对象,而self.name
是行中设置的字符串
self.name = which
还有两个与您的其他问题相关的基本问题。
你永远不会使用行本身l
,这就是你遍历文件的全部原因。也许你打算写Record(l)
。
为什么Record类继承SourceFile
对象(代码为class Record(SourceFile)
?)你应该仔细阅读inheritance:继承用于共享方法和属性在多个对象之间,它并不真正适用于此代码。