Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在类中使用函数_Python_Class - Fatal编程技术网

Python 在类中使用函数

Python 在类中使用函数,python,class,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' : 'ze

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

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())
第一次
打印
返回
一二三josh street ontoria六七五canada
,如预期,但第二次打印失败,出现
名称错误:未定义名称“norm_func”

我知道从类内调用函数需要
self
实例,但我不明白为什么当我运行第一个
print
函数并成功调用其他两个函数时,它会起作用,其中一个没有
self

既然
norm\u函数
起作用,为什么
encode\u拼音
不起作用呢

回溯错误

123Josh街ontoria六七五加拿大
---------------------------------------------------------------------------
NameError回溯(最近一次呼叫上次)
在()
4.
5打印(string.norm_func())
---->6打印(string.encode_拼音())
在encode_拼音中(self)
31
32 def encode_拼音(self):
--->33返回[norm_func()中的i代表i]
进一步编辑


糟糕的是,内核定义了存在于全局空间的函数,而我运行它们时认为它只存在于局部空间。重新启动内核后,错误会有所不同。按照建议给出,
words2numbered未定义

要引用对象的方法,您需要指定每次处理的实例(与Java不同)。因此,
encode\u拼音
需要:

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

同样的问题也存在于一些已定义的方法中,例如,
norm\u func
指的是
alpha\u数
替换标点符号
,而不使用
self

这是相当混乱的,您定义类
bstring
,但创建
f_string
对象,定义函数
alpha_num
,然后调用
alpha_numbers
。最好直接复制粘贴代码。抱歉,我做了一些编辑。我太糊涂了。HahaI不相信给出的代码会像您描述的那样工作。@khelwood不相信基于什么?基于它与Python代码没有任何意义。你会得到
名称错误:第一次调用
alpha_num()
时,没有定义全局名称“words2numes”。你知道为什么
替换标点符号
有效,尽管我没有放置
self
?对字段的唯一引用前面有
self
,即
self.s.translate(表)
@BernardL我认为它不应该工作,除非你对函数有一个全局定义。试着在课堂外给它打电话——如果有其他的定义,那应该可以。是的,我的错,它失败了。如果您看到更新的部分,那么当我在前面声明变量时(在示例之外),我感到很困惑。
def encode_phonetic(self):
    return [i for i in self.norm_func()]
#                      ^^^^^