s="ABC"
for k in ["isalnum()", "isalpha()", "isdigit()", "islower()", "isupper()"]:
for c in s:
print(c.k)
在执行上述代码时得到此错误“ AttributeError:'str'对象没有属性'k'”。我提到了与此错误有关的其他类似问题,但与我的问题无关,我对python非常陌生。
答案 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.isalpha
在isalpha
上查找type(s)
方法,并将其绑定到s
实例,返回一个知道要调用{{1 }},并且它想在isalpha
上调用它。接下来,调用该绑定方法,方法是调用s
并将isalpha
作为第一个(s
)参数传递。
因此,您只是手动执行相同的操作:self
仅是str.isalpha
函数,并且您以isalpha
作为第一个({{1} })参数。