有没有办法识别类和对象

2024-04-18 13:09:50 发布

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

例如我有课

Class Cls:
   var 1 
   var 2

   def func(self):
      --- do some statement

现在,我可以简单地导入类并创建对象

^{pr2}$

在这里,Cls是类,clsObj是类的实例。我有什么办法区分它们吗。在

谢谢你


Tags: 实例selfvardefsomedoclass区分
3条回答

我认为这会考虑到所有的情况:

def isclass(obj):
    try:
        class_ = obj.__class__
    except AttributeError:
        # It's an old-style class
        return True
    try:
        class_.__class__
    except AttributeError:
        # It's an old-style instance
        return False
    # It's new-style
    return isinstance(obj, type)

现在让我们测试它,以确保它按预期/预期工作:

^{pr2}$

输出:

         isclass(OldStyle) ==  True,        isclass(OldStyle()) == False
         isclass(NewStyle) ==  True,        isclass(NewStyle()) == False
         isclass(WithMeta) ==  True,        isclass(WithMeta()) == False
        isclass(MetaClass) ==  True,       isclass(MetaClass()) ==  True
    isclass(class_factory) == False,   isclass(class_factory()) ==  True
        isclass(confusing) == False,       isclass(confusing()) == False

MetaClassclass_factory和{}说明了在python中什么构成类是有争议的,并展示了isclass函数如何处理这些情况。在

回复:agf

MetaClass并不是要这样实例化的,所以您避免错误的技巧实际上只是混淆了问题;为MetaClass()打印“error”会更正确。

你还是我写了MetaClass?我的意思是像那样实例化它。我承认,每次调用一个元类(或类工厂函数)都创建“相同”的类是没有意义的,当然这会令人困惑。但是,为了这些特定的目的,我想说明元类在实例化时会创建一个类,并且在输出中有很多MetaClass()的参数将是一个组合中断符。:)所以原则上我同意你的观点,但是为了这个特定的目的,我是这样做的,python允许我这样做。在

__call__发生在__new__之前,所以WithMeta()confusing和{}显示的内容是正确的。

如果你所说的“发生”意味着“被解析、编译和绑定”,那么是的,首先发生。我不确定我是否理解你的意思。我同意它是正确的——当然它是正确的,这段代码是编写并运行的,我发布了我得到的结果,所以它不能不正确。我不知道__call__与它有什么关系。你能详细说明一下吗?在

你从来没有真正实例化过WithMeta。您应该删除__call__,并显示confusing()的错误

我很确定我会实例化WithMeta

>>> WithMeta()
<isclass.WithMeta object at 0xb784574c>

当我写WithMeta()时,python会检查type(WithMeta).__new__是否定义了,因此python将类名、基和名称空间dict作为MetaClass.__new__()的参数。它返回WithMeta类对象,这是通过使用相同的参数调用type来实现的。在

另一方面,confusing()与{}相同,后者只返回参数,因此confusing == confusing()。在

我不明白你为什么要这么做,但你可以这样做:

if type(obj) == type:
    # It's a class.
else:
    # It's an instance of a class.

是的,只需使用内置的type(),它给出了特定对象的类型。类型(clsObj)将给出实例作为答案。您也可以使用isinstance进行检查 isinstance(clsObj,Cls)将返回True,而{}将返回{}

相关问题 更多 >