我很抱歉,如果我遇到了令人难以置信的愚蠢,我对python相对较新,我无法弄清楚我在这里做错了什么。
我有两个类,我尝试用
获取两个类的类名*class*.__class__.__name__
现在,正如我所说,这适用于一个班级,但不适用于另一个班级。
这些是我的课程:
class fb():
val = 300
mult = 2.0
shsym = pygame.image.load('img/dummy2.png')
value = 50
class a():
occ = 0
shsym = pygame.image.load('img/it/a/shsym.png')
plsym = pygame.image.load('img/it/a/plsym.png')
value = 100
hesyms = [pygame.image.load('img/a/hesym0',pygame.image.load('img/dummy.png'))]
coord = [(50, 300),(30, 435),(310, 350)]
里面的变量可能并不重要,但由于我无法弄清楚问题,我只是把整个事情都包括在内。
然后我定义它们
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它没有。 我知道我可以用不同的方式做到这一点,而且我的全班系统并不是真正的常规系统,但如果我不需要的话,我真的不想改变它。
答案 0 :(得分:3)
注意:这是格斗的Python 2的东西。在Python 3中,情况有所不同,因为在Python 3中,默认情况下每个类都是"new style"。新风格的类本身也是他们meta-class的“简单”实例(通常这个元类是type
)。这意味着Python 3中的类(以及继承自object
的Python 2类)实际上具有__class__
属性(其携带其元类)。现在不要担心元课程。
发生错误时,itemselect
是类,而不是实例,这就是它没有__class__
属性的原因。
你这么说:
然后我将变量设置为已定义的类之一
确实,类没有__class__
属性。只有类的实例(也称为对象)具有该属性:
>>> class Foo:
... pass
...
>>> hasattr(Foo, "__class__")
False
>>> f = Foo()
>>> hasattr(f, "__class__")
True
>>> f.__class__ is Foo
True
您需要强烈区分类和对象,因为在大多数情况下,混合它们是错误的。
另外,你真的,真的,真的不应该这样做。您可以轻松地将其转换为基于issubclass的检查。
创建一个名为f
的空类:
class f:
pass
现在将所有名称以f
开头的类放在该类上:
class fb(f):
val = 300
mult = 2.0
shsym = pygame.image.load('img/dummy2.png')
value = 50
现在,不要进行讨厌的.startswith
检查,而是使用issubclass
:
if issubclass(itemselect, f):
这比检查班级名称中的第一个字符要清晰得多。
另外,作为现在的初学者,你真的不应该使用Python 2,现在你也没有借口使用旧式的课程,因为你知道new-style exists。它将使您的代码和 Python的工作原理更容易移植到Python 3中。