Can';t在Python中访问对象中的列表
我有一个简单的应用程序,我希望能够添加文本,句子和标记组织的文本。每个文本包含多个句子,每个句子包含多个标记。我的课程是这样的:Can';t在Python中访问对象中的列表,python,Python,我有一个简单的应用程序,我希望能够添加文本,句子和标记组织的文本。每个文本包含多个句子,每个句子包含多个标记。我的课程是这样的: class Text: sentences = [] def __init__(self, meta): self.meta = meta def getSentences(self): return self.sentences def addSentence(self, s):
class Text:
sentences = []
def __init__(self, meta):
self.meta = meta
def getSentences(self):
return self.sentences
def addSentence(self, s):
self.sentences.append(s)
class Sentence:
tokens = []
def __init__(self):
pass
def getTokens(self):
return self.tokens
def addToken(self, t):
self.tokens.append(t)
class Token:
def __init__(self, word, pos):
self.word = word
self.pos = pos
def getWord(self):
return self.word
def getpos(self):
return self.pos
print txt.getSentences[0].getTokens[0]
然后我创建一个标记、一个句子和一个文本,如下所示:
token = Token("a", "b")
sent = Sentence()
sent.addToken(token)
txt = Text("meta")
txt.addSentence(sent)
现在,当我想访问该令牌,即第一个文本第一句的第一个令牌时,我希望能够执行如下操作:
class Text:
sentences = []
def __init__(self, meta):
self.meta = meta
def getSentences(self):
return self.sentences
def addSentence(self, s):
self.sentences.append(s)
class Sentence:
tokens = []
def __init__(self):
pass
def getTokens(self):
return self.tokens
def addToken(self, t):
self.tokens.append(t)
class Token:
def __init__(self, word, pos):
self.word = word
self.pos = pos
def getWord(self):
return self.word
def getpos(self):
return self.pos
print txt.getSentences[0].getTokens[0]
。。。这根本不起作用。我可以像这样访问GetSequences方法
print txt.getSentences
这给了我这个
<bound method Text.getSentences of <txt.Text instance at 0x1006d5a70>>
试试这个:
print txt.getSentences()[0].getTokens()[0]
这将返回列表而不是方法。您的代码有两个问题 首先,您将
语句
和标记
定义为类变量
>>> class Test:
... myvar = []
...
>>>
>>> t1 = Test()
>>> t1.myvar.append(10)
[10]
>>> t2 = Test()
>>> print(t2.myvar)
[10]
您应该在中初始化这些变量
其次,在python中,函数是通过()
操作符调用的,只要引用函数名就返回函数对象
>>> def myfunc():
... print("hello,world!")
...
>>> yourfunc = myfunc
>>> yourfunc()
hello,world!
在使用可变句子的情况下,您可以使用txt.statemens
直接访问它,python中没有私有/公共方法的区别,在
-和
-dunder前缀下有名称,但这是惯例。作为补充说明:为您的类提供MyInstance[0]的行为,与list一样,您必须定义特殊的方法
__getitem__
你不能调用self.句子。您的句子列表不是实例变量,因为您没有在init中定义它。如果要将其用作类变量,请使用:Text.句
。在每个类中,包含元素的列表不是实例属性,而是类属性
。将它们移动到\uuuu init\uuuuu
(例如self.tokens=[]
)@Scott这是不正确的:self.attribute
到达变量,但它不属于对象实例,而是属于类。所以它在类的每个对象之间共享。我现在已经把我的列表放在init中了,但是我仍然不知道如何访问令牌。例如,“print txt.getSequences()[0]”给了我“”。您想打印什么?单词还是位置?您可以执行打印txt.GetSequences()[0].getTokens()[0].getWord()
的操作,它可以打印a
。或者您可以向令牌添加一个方法:def\uu str\uuuu(self):返回“word:{},pos:{}”。格式化(self.word,self.pos)
,这样您就可以打印整个令牌:print txt.get句子()[0]。getTokens()[0]
打印:word:a,pos:b
。但不清楚您想要得到什么作为输出。