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

时间:2018-08-22 18:04:52

标签: python python-3.x

s="ABC"

for k in ["isalnum()", "isalpha()", "isdigit()", "islower()", "isupper()"]:
    for c in s:
        print(c.k)

在执行上述代码时得到此错误“ AttributeError:'str'对象没有属性'k'”。我提到了与此错误有关的其他类似问题,但与我的问题无关,我对python非常陌生。

4 个答案:

答案 0 :(得分:7)

列表中的元素只是字符串。即使没有,c.k总是会引用文字属性k,而不是列表中对应的属性。

您需要使用getattr;但是括号不是属性名称的一部分,您需要将其保留。

for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:
    for c in s:
        print(getattr(c, k)())

答案 1 :(得分:5)

您可能想调用在operating system: Windows 10 testcafe version: 0.21.1 node.js version: 9.3.0 字符上列出的方法。

一种可能性是使用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 ... True True True True True True False False False False False False True True True 类的方法:

str

(我使用了您所做的变量名,但是建议至少将>>> s = "ABC" >>> for k in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]: ... for c in s: ... k(c) ... True True True True True True False False False False False False True True True 重命名为k。)

答案 2 :(得分:0)

您不能将字符串拼接成这样的代码。

这应该有效:

import operator

s = "ABC"

for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:
    for c in s:
        print(operator.methodcaller(k)(c)

methodcaller(method_name)创建一个新函数,该函数在其参数上调用命名方法。因此methodcaller("islower")有点像lambda x: x.islower(),因此methodcaller("islower")("a")等效于"a".islower()

答案 3 :(得分:0)

Daniel Roseman's answer简洁但完整地解释了代码的问题以及如何使代码正常工作。

但是,每当您发现自己尝试使用事物的字符串名称而不是事物本身时,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.isalphaisalpha上查找type(s)方法,并将其绑定到s实例,返回一个知道要调用{{1 }},并且它想在isalpha上调用它。接下来,调用该绑定方法,方法是调用s并将isalpha作为第一个(s)参数传递。

因此,您只是手动执行相同的操作:self仅是str.isalpha函数,并且您以isalpha作为第一个({{1} })参数。