很抱歉,如果我被认为是难以置信的愚蠢,我对python还比较陌生,我不知道我在这里做错了什么。在
我有两个类,我试图用
*class*.__class__.__name__
现在,正如我所说,这对一个班有效,但对另一个班不行。在
以下是我的课程:
^{pr2}$里面的变量可能并不重要,但因为我无法解决问题,所以我把所有的东西都包括进去了。在
然后我定义它们
fob = fb()
ita = a()
然后我设置一个变量作为定义的类之一
itemselect = fob
最后,我试着检查类的名称,看看它是否以“f”开头(看看它是否是一组项的一部分)
if not itemselect.__class__.__name__.startswith("f"):
在那一行我得到了错误信息
Traceback (most recent call last):
File "D:\Programmieren\Cola Atsume\main.py", line 283, in <module>
if not itemselect.__class__.__name__.startswith("f"):
AttributeError: class fa has no attribute '__class__'
当itemselect是ita时,一切都很好,但是对于fob就不行了。 我知道我可以用不同的方式来做这件事,而且我的整个班级体系并不是很传统,但如果不需要的话,我真的不想改变它。在
注意:这是grindy Python2的素材。在Python3中,情况有所不同,因为在Python3中,默认情况下每个类都是"new style"。新样式类本身也是它们的meta-class(通常这个元类是
type
)的“简单”实例。这意味着python3中的一个类(以及从object
继承的python2类)实际上有一个__class__
属性(它携带它的元类)。现在不要担心元类。在当错误发生时,
itemselect
是一个类,而不是一个实例,这就是它没有__class__
属性的原因。在你说:
确切地说,and类没有
__class__
属性。只有类的实例(也称为对象)具有该属性:您需要强烈区分类和对象,因为在大多数情况下,将它们混合在一起是错误的。在
而且,你真的,真的,真的不应该这样做。您可以轻松地将其转换为基于issubclass的检查。在
创建一个名为
^{pr2}$f
的空类:现在,所有名称以
f
开头的类都基于该类:现在,不用做讨厌的
.startswith
检查,而是使用issubclass
:这已经比检查类名中的第一个字符干净多了。在
另外,作为一个初学者,你真的不应该使用Python2,而且现在你也没有理由使用老式的类,因为你知道new-style exists。它将使您的代码和Python工作原理的思想模型移植到python3更容易。在
相关问题 更多 >
编程相关推荐