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

Python错误:AttributeError:“str”对象没有属性“k”,python,python-3.x,Python,Python 3.x,获取此错误AttributeError:“str”对象在执行上述代码时没有属性“k”。我参考了关于此错误的其他类似问题,但与我的问题无关,我对python非常陌生。列表中的元素只是字符串。即使它们不是,c.k总是会引用文本属性k,而不是列表中对应的属性 您需要使用getattr;但是括号不是属性名的一部分,您需要将它们去掉 s="ABC" for k in ["isalnum()", "isalpha()", "isdigit()", "islower()", "isupper()"]:

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

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

您需要使用getattr;但是括号不是属性名的一部分,您需要将它们去掉

s="ABC"

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

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

您需要使用getattr;但是括号不是属性名的一部分,您需要将它们去掉

s="ABC"

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

你不能像那样把字符串拼接成代码

这应该起作用:

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

methodcallermethod_name创建一个新函数,该函数在其参数上调用命名方法。所以methodcallerislower有点像lambda x:x.islower,因此methodcallerislowera相当于a.islower。

您不能像那样将字符串拼接到代码中

这应该起作用:

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

methodcallermethod_name创建一个新函数,该函数在其参数上调用命名方法。因此methodcallerislower有点像lambda x:x.islower,因此methodcallerislowera相当于a.islower。

您可能需要调用在s的字符上列出的方法

一种可能是使用getattr按字符串名称查找对象的属性:

import operator

s = "ABC"

for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:
    for c in s:
        print(operator.methodcaller(k)(c)
或者,您可以直接循环str类的方法:

>>> 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

我使用了您使用的变量名,但是我建议至少将k重命名为method。

您可能希望调用在s字符上列出的方法

一种可能是使用getattr按字符串名称查找对象的属性:

import operator

s = "ABC"

for k in ["isalnum", "isalpha", "isdigit", "islower", "isupper"]:
    for c in s:
        print(operator.methodcaller(k)(c)
或者,您可以直接循环str类的方法:

>>> 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
我使用了您使用的变量名,但我建议至少将k重命名为method。

简洁但完整地解释了代码的错误以及如何使代码工作

但是,每当您发现自己试图使用事物的字符串名称而不是事物本身时,Python中通常有更好的方法。因此,值得寻找更好的方法,并决定是否使用它

在本例中,您真正需要的是字符串方法列表。事实上,您可以直接创建字符串方法列表:

>>> 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
那太好了;这些方法是Python中的一流对象,就像字符串或常规函数一样。事实上,在封面下,除非您使用的是Python 2,否则它们只是函数。但是你能用它们做什么呢

您可以调用它们,就像调用函数一样:

for k in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]:
如果您想了解它是如何工作的,您需要知道普通方法调用是如何工作的

当你写这篇文章时:

    for c in s:
        print(k(c))
…这有两个部分。首先,s.isalpha在类型上查找isalpha方法,并将其绑定到s实例,返回一个绑定方法对象,该对象知道它想要调用isalpha,并且它想要在s上调用它。接下来,调用绑定方法,这是通过调用isalpha并传递s作为第一个自参数来实现的

因此,您只是手动执行相同的操作:str.isalpha只是isalpha函数,您使用s作为第一个自变量调用它。

简洁但完整地解释了代码的错误以及如何使代码工作

但是,每当您发现自己试图使用事物的字符串名称而不是事物本身时,Python中通常有更好的方法。因此,值得寻找更好的方法,并决定是否使用它

在本例中,您真正需要的是字符串方法列表。事实上,您可以直接创建字符串方法列表:

>>> 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
那太好了;这些方法是Python中的一流对象,就像字符串或常规函数一样。事实上,在封面下,除非您使用的是Python 2,否则它们只是函数。但是你能用它们做什么呢

您可以调用它们,就像调用函数一样:

for k in [str.isalnum, str.isalpha, str.isdigit, str.islower, str.isupper]:
如果您想了解它是如何工作的,您需要知道普通方法调用是如何工作的

当你写这篇文章时:

    for c in s:
        print(k(c))
…这有两个部分。首先,s.isalpha在类型上查找isalpha方法,并将其绑定到s实例,返回一个绑定方法对象,该对象知道它想要调用isalpha,并且它想要在s上调用它。接下来,调用绑定方法,这是通过调用isalpha并传递s作为第一个自参数来实现的


因此,您只是手动执行相同的操作:str.isalpha只是isalpha函数,您使用s作为第一个自变量来调用它。

您能提供一个您想要t的输出示例吗

看到了吗?我想为字符串的每个字符在外部for循环中运行方法s@Vicky为什么你希望c有一个属性k?你能提供一个你想看到的输出的例子吗?我想为字符串的每个字符在外部for循环中运行方法s@Vicky为什么你希望c有一个属性k?谢谢,但是为什么k没有在列表中引用它的值呢?@Vicky,但它是。@Vicky no.object.foo请求一个名为foo的属性。不,为什么它会这样做?这意味着您永远不能拥有与任何类上的任何属性同名的局部变量,否则您永远不能调用实际属性,这将是不可能的限制。正如tim所说,c.k总是引用名为k的属性。@timgeb,谢谢tim。谢谢,但是为什么k在列表中没有引用它的值?@Vicky,但它是。@Vicky否。object.foo请求一个名为foo的属性。不,为什么它会这样做?这意味着您永远不能拥有与任何类上的任何属性同名的局部变量,否则您永远不能调用实际属性,这将是不可能的限制。正如tim所说,c.k总是引用名为k的属性。@timgeb,谢谢tim。我现在得到这个错误AttributeError:'str'对象没有属性'isalnum'@Vicky您忘记从字符串中删除。不,我复制粘贴了您的替代代码并获得了error@Vicky错误在你这边。我的代码从不请求isalnum的属性查找。可能您在编辑文件后忘记保存它。我现在收到此错误AttributeError:“str”对象没有属性“isalnum”@Vicky您忘记从字符串中删除。不,我复制粘贴了您的替代代码并获得了error@Vicky错误在你这边。我的代码从不请求isalnum的属性查找。可能您在编辑文件后忘记保存它。