在类中使用函数

时间:2018-11-05 01:14:07

标签: python class

我写了一个类来包装一些字符串操作方法,例如:

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

1 个答案:

答案 0 :(得分:3)

要引用对象的方法,您需要每次指定要处理的实例(不同于Java)。因此encode_phonetic必须是:

def encode_phonetic(self):
    return [i for i in self.norm_func()]
#                      ^^^^^

在一些已定义的方法中也存在相同的问题,例如norm_func指的是alpha_numbersreplace_punctuation,而没有self