我写了一个类来包装一些字符串操作方法,例如:
class bstring(str):
words2numbers = {
'1' : 'one ',
'2' : 'two ',
'3' : 'three ',
'4' : 'four ',
'5' : 'five ',
'6' : 'six ',
'7' : 'seven ',
'8' : 'eight ',
'9' : 'nine ',
'0' : 'zero '
}
def __init__(self,s):
self.s = s
def alpha_num(self):
return ''.join(words2numbers[i] if i in words2numbers else i for i in self.s)
def replace_punctuation(self):
import string
table = str.maketrans({key: None for key in string.punctuation})
return self.s.translate(table)
def norm_func(self):
s = self.alpha_num()
s = replace_punctuation(s)
s = ' '.join(i for i in s.split())
return s.lower()
def encode_phonetic(self):
return [i for i in norm_func()]
使用示例测试:
rand_string = '123 Josh Street, Ontoria, 675 Canada'
string = bstring(rand_string)
print(string.norm_func())
print(string.encode_phonetic())
第一个print
返回one two three josh street ontoria six seven five canada
,这与预期的一样,但是第二个打印失败,并显示NameError: name 'norm_func' is not defined
。
我知道从一个类中调用函数需要一个self
实例,但是我迷惑了为什么在我运行第一个print
函数并成功调用其他2个函数时它起作用的原因,其中一个没有有self
。
鉴于norm_function
有效的事实,为什么encode_phonetic
不起作用?
跟踪错误
one two three josh street ontoria six seven five canada
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-440-ecf7dd4f18e5> in <module>()
4
5 print(string.norm_func())
----> 6 print(string.encode_phonetic())
<ipython-input-437-23c9ae68fa2f> in encode_phonetic(self)
31
32 def encode_phonetic(self):
---> 33 return [i for i in norm_func()]
其他修改
糟糕的是,内核具有定义在全球空间中存在的功能,而我正在运行它们时认为它们仅存在于本地空间中。随着内核的重新启动,错误将有所不同。按照建议进行操作,words2numbered is not defined
。
答案 0 :(得分:3)
要引用对象的方法,您需要每次指定要处理的实例(不同于Java)。因此encode_phonetic
必须是:
def encode_phonetic(self):
return [i for i in self.norm_func()]
# ^^^^^
在一些已定义的方法中也存在相同的问题,例如norm_func
指的是alpha_numbers
和replace_punctuation
,而没有self
。