猿问

Python错误:AttributeError:'str'对象没有属性'k'

s="ABC"


for k in ["isalnum()", "isalpha()", "isdigit()", "islower()", "isupper()"]:

    for c in s:

        print(c.k)

执行上述代码时出现此错误“AttributeError: 'str' object has no attribute 'k'”。我提到了与此错误有关的其他类似问题,但与我的问题无关,我对python非常陌生。


一只斗牛犬
浏览 1555回答 3
3回答

婷婷同学_

您可能想要调用您在s.一种可能性是使用getattr以通过字符串名称查找对象的属性:>>> s = "ABC">>> for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:...     for c in s:...         getattr(c, k)() # get the attribute, then call it... TrueTrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseTrueTrueTrue或者,您可以str直接遍历类的方法:>>> s = "ABC">>> for k in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]:...     for c in s:...         k(c)... TrueTrueTrueTrueTrueTrueFalseFalseFalseFalseFalseFalseTrueTrueTrue(我使用了您所做的变量名称,但是我建议至少重命名k为method.)

潇湘沐

列表中的元素只是字符串。即使它们不是,c.k也总是要引用文字属性k,而不是与列表中的属性相对应的属性。你需要使用getattr; 但是括号不是属性名称的一部分,您需要将其省略。for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:    for c in s:        print(getattr(c, k)())

慕少森

Daniel Roseman 的回答简洁但完整地解释了您的代码有什么问题,以及如何使您的代码工作。但是,每当您发现自己尝试使用事物的字符串名称而不是事物本身时,Python中通常会有更好的方法。因此,值得寻找更好的方法,并决定是否要使用它。在这种情况下,您真正想要的是字符串方法列表。事实上,你可以直接创建一个字符串方法列表:for k in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]:那太棒了; 这些方法是 Python 中的一流对象,就像字符串或常规函数一样。(事实上,在幕后,除非你使用Python 2,他们只是在功能)。但是你能对他们做什么?您可以像调用函数一样调用它们:    for c in s:        print(k(c))如果你想了解它是如何工作的,你需要知道普通的方法调用是如何工作的。当你写这个:s.isalpha()……这有两个部分。首先,s.isalpha在isalpha方法上查找方法type(s),并将其绑定到s实例,返回一个绑定的方法对象,该对象知道它要调用isalpha并且要在上调用它s。接下来,您调用绑定方法,这是通过调用isalpha和传递s作为第一个 ( self) 参数来实现的。所以,你只是手动做同样的事情:str.isalpha只是isalpha函数,你用s第一个 ( self) 参数调用它。
随时随地看视频慕课网APP

相关分类

Python
我要回答