Python错误:AttributeError:“str”对象没有属性“k”
获取此错误AttributeError:“str”对象在执行上述代码时没有属性“k”。我参考了关于此错误的其他类似问题,但与我的问题无关,我对python非常陌生。列表中的元素只是字符串。即使它们不是,c.k总是会引用文本属性k,而不是列表中对应的属性 您需要使用getattr;但是括号不是属性名的一部分,您需要将它们去掉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()"]:
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的属性查找。可能您在编辑文件后忘记保存它。