3 回答

TA贡献1844条经验 获得超8个赞
您可能想要调用您在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为method.)

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

TA贡献2019条经验 获得超9个赞
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) 参数调用它。
添加回答
举报