Python .__ class __.__ name__适用于一个类而不适用于另一个类

时间:2017-03-09 20:06:56

标签: python class attributeerror

我很抱歉,如果我遇到了令人难以置信的愚蠢,我对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它没有。 我知道我可以用不同的方式做到这一点,而且我的全班系统并不是真正的常规系统,但如果我不需要的话,我真的不想改变它。

1 个答案:

答案 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中。