【发布时间】:2018-06-15 11:50:31
【问题描述】:
我在将对象的实例变量传递给实例方法时遇到问题。
我已经在其他地方搜索过这个,但我一直在寻找的只是关于如何使用我已经知道的self 将对象传递给方法的信息,或者只是关于类和实例方法之间一般差异的教程t 具体回答我的问题。我的问题的答案肯定存在于某个地方,我想我只是不知道实际要求什么。
在我的代码中,我有这个类:
class SongData:
def __init__(self, datapoint):
self.artist = datapoint['artist']
self.track = datapoint['name']
def xtradata_rm(self, regex, string=None):
if string is None:
string = self
srchrslts = re.search(regex, string)
if srchrslts is not None:
if regex == 'f.*?t':
self = self.replace(string,'')
self.xtradata_rm('\((.*?)\)')
else:
self.xtradata_rm('f.*?t', srchrslts)
def example_method(self):
#This one isn't actually in the code, included for ease of explanation.
print(self)
#some more methods irrelevant to question down here.
假设我们通过song = SongData(datapoint) 实例化一个对象。方法xtradata_rm 应该在song.artist 或song.track 字符串中搜索括号中的部分,然后如果找到的部分包含任何形式的“功能”一词,则从字符串中删除它,然后重试直到没有发现更多括号中包含“特征”的括号表达式。
我现在知道这可能是 100% 错误的 self 用法,但我不知道用什么代替它来实现我想要的行为。那么在我的脚本中我尝试这样做:
file_list = glob.glob("*procData.json")
for datafname in file_list:
datafile = json.load(open(datafname))
for i, datapoint in enumerate(datafile['EnvDict']):
song = SongData(datapoint)
song.track.xtradata_rm('\((.*?)\)')
song.releasefetch(lfmapi)
song.dcsearcher(dcapi)
datapoint.update({"album": song.release, "year": song.year})
with open("upd" + datafname, 'w') as output:
json.dump(datafile, output)
然后我得到这个错误:
Traceback (most recent call last):
song.track.xtradata_rm('\((.*?)\)')
AttributeError: 'str' object has no attribute 'xtradata_rm'
如果我注释掉那一行,代码就会运行。
所以我的第一个问题是,一般来说,我该怎么做才能去song.track.example_method() 或song.artist.example_method() 并按预期在控制台中分别打印track_name 或artist_name。
我的第二个问题是,我怎样才能对xtradata_rm 做同样的事情(即
能够做到song.track.xtradata_rm('\((.*?)\)') 并基本上在方法中插入song.track 代替self),以及xtradata_rm 是如何递归并试图将实例变量隐式传递给自身内部改变的?
【问题讨论】:
-
您的代码的问题是您试图将
song.track作为self传递给xtradata_rm方法。相反,当您将其调用为song.xtradata_rm('\((.*?)\)')时,请在xtradata_rm方法中使用 self.track
标签: python regex python-3.x