Python.\uuu class\uuuname_优只适用于一个类而不适用于另一个类

2024-07-05 10:08:12 发布

您现在位置:Python中文网/ 问答频道 /正文

很抱歉,如果我被认为是难以置信的愚蠢,我对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就不行了。 我知道我可以用不同的方式来做这件事,而且我的整个班级体系并不是很传统,但如果不需要的话,我真的不想改变它。在


Tags: namefbif定义notclass课程解决问题
1条回答
网友
1楼 · 发布于 2024-07-05 10:08:12

注意:这是grindy Python2的素材。在Python3中,情况有所不同,因为在Python3中,默认情况下每个类都是"new style"。新样式类本身也是它们的meta-class(通常这个元类是type)的“简单”实例。这意味着python3中的一个类(以及从object继承的python2类)实际上有一个__class__属性(它携带它的元类)。现在不要担心元类。在

当错误发生时,itemselect是一个,而不是一个实例,这就是它没有__class__属性的原因。在

你说:

Then I set a variable as one of the defined classes

确切地说,and没有__class__属性。只有类的实例(也称为对象)具有该属性:

>>> class Foo:
...     pass
... 
>>> hasattr(Foo, "__class__")
False
>>> f = Foo()
>>> hasattr(f, "__class__")
True
>>> f.__class__ is Foo
True

您需要强烈区分类和对象,因为在大多数情况下,将它们混合在一起是错误的。在


而且,你真的,真的,真的不应该这样做。您可以轻松地将其转换为基于issubclass的检查。在

创建一个名为f的空类:

^{pr2}$

现在,所有名称以f开头的类都基于该类:

class fb(f):
    val = 300
    mult = 2.0
    shsym = pygame.image.load('img/dummy2.png')
    value = 50

现在,不用做讨厌的.startswith检查,而是使用issubclass

if issubclass(itemselect, f):

这已经比检查类名中的第一个字符干净多了。在


另外,作为一个初学者,你真的不应该使用Python2,而且现在你也没有理由使用老式的类,因为你知道new-style exists。它将使您的代码和Python工作原理的思想模型移植到python3更容易。在

相关问题 更多 >