2024-04-18 13:09:50 发布
网友
例如我有课
Class Cls: var 1 var 2 def func(self): --- do some statement
现在,我可以简单地导入类并创建对象
在这里,Cls是类,clsObj是类的实例。我有什么办法区分它们吗。在
谢谢你
我认为这会考虑到所有的情况:
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)
现在让我们测试它,以确保它按预期/预期工作:
输出:
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
MetaClass、class_factory和{}说明了在python中什么构成类是有争议的,并展示了isclass函数如何处理这些情况。在
MetaClass
class_factory
isclass
回复:agf
MetaClass并不是要这样实例化的,所以您避免错误的技巧实际上只是混淆了问题;为MetaClass()打印“error”会更正确。
MetaClass()
你还是我写了MetaClass?我的意思是像那样实例化它。我承认,每次调用一个元类(或类工厂函数)都创建“相同”的类是没有意义的,当然这会令人困惑。但是,为了这些特定的目的,我想说明元类在实例化时会创建一个类,并且在输出中有很多MetaClass()的参数将是一个组合中断符。:)所以原则上我同意你的观点,但是为了这个特定的目的,我是这样做的,python允许我这样做。在
__call__发生在__new__之前,所以WithMeta()、confusing和{}显示的内容是正确的。
__call__
__new__
WithMeta()
confusing
如果你所说的“发生”意味着“被解析、编译和绑定”,那么是的,首先发生。我不确定我是否理解你的意思。我同意它是正确的——当然它是正确的,这段代码是编写并运行的,我发布了我得到的结果,所以它不能不正确。我不知道__call__与它有什么关系。你能详细说明一下吗?在
你从来没有真正实例化过WithMeta。您应该删除__call__,并显示confusing()的错误
WithMeta
confusing()
我很确定我会实例化WithMeta:
>>> WithMeta() <isclass.WithMeta object at 0xb784574c>
当我写WithMeta()时,python会检查type(WithMeta).__new__是否定义了,因此python将类名、基和名称空间dict作为MetaClass.__new__()的参数。它返回WithMeta类对象,这是通过使用相同的参数调用type来实现的。在
type(WithMeta).__new__
MetaClass.__new__()
type
另一方面,confusing()与{}相同,后者只返回参数,因此confusing == 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,而{}将返回{}
isinstance
isinstance(clsObj,Cls)
True
我认为这会考虑到所有的情况:
现在让我们测试它,以确保它按预期/预期工作:
^{pr2}$输出:
MetaClass
、class_factory
和{isclass
函数如何处理这些情况。在回复:agf
MetaClass
并不是要这样实例化的,所以您避免错误的技巧实际上只是混淆了问题;为MetaClass()
打印“error”会更正确。你还是我写了
MetaClass
?我的意思是像那样实例化它。我承认,每次调用一个元类(或类工厂函数)都创建“相同”的类是没有意义的,当然这会令人困惑。但是,为了这些特定的目的,我想说明元类在实例化时会创建一个类,并且在输出中有很多MetaClass()
的参数将是一个组合中断符。:)所以原则上我同意你的观点,但是为了这个特定的目的,我是这样做的,python允许我这样做。在__call__
发生在__new__
之前,所以WithMeta()
、confusing
和{如果你所说的“发生”意味着“被解析、编译和绑定”,那么是的,首先发生。我不确定我是否理解你的意思。我同意它是正确的——当然它是正确的,这段代码是编写并运行的,我发布了我得到的结果,所以它不能不正确。我不知道
__call__
与它有什么关系。你能详细说明一下吗?在你从来没有真正实例化过
WithMeta
。您应该删除__call__
,并显示confusing()
的错误我很确定我会实例化
WithMeta
:当我写
WithMeta()
时,python会检查type(WithMeta).__new__
是否定义了,因此python将类名、基和名称空间dict作为MetaClass.__new__()
的参数。它返回WithMeta
类对象,这是通过使用相同的参数调用type
来实现的。在另一方面,}相同,后者只返回参数,因此
confusing()
与{confusing == confusing()
。在我不明白你为什么要这么做,但你可以这样做:
是的,只需使用内置的type(),它给出了特定对象的类型。类型(clsObj)将给出实例作为答案。您也可以使用}将返回{}
isinstance
进行检查isinstance(clsObj,Cls)
将返回True
,而{相关问题 更多 >
编程相关推荐