检查分部(类)是否为类实例的最佳方法

2024-05-13 16:47:41 发布

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

下面是我的设置:

from functools import partial

class MyClass:
    def __init__(self, some_kwarg=0):
        pass

def func(class):
    # VERSION 1: I don't do anything

    # VERSION 2: I do this
    class = partial(class, some_kwarg=1)
   
    # check if class points to MyClass
    ### THIS is where I want your input stack overflow

对我来说,这里有几件事:

  1. 在版本1中,我应该执行class == MyClass
  2. 在版本2中,我如何将答案修改为1来解释partial。我天真的解决办法是class.func == MyClass
  3. 我如何处理我不知道它将是哪个版本的情况?我天真的做法是(class == MyClass or (isinstance(class, partial) and partial.func == MyClass))

Tags: fromimportself版本initversiondefmyclass
2条回答

MyClass是可调用的,调用时返回MyClass的实例

partial只是将MyClass包装在一个可调用对象中,该对象在被调用时,使用一些预先确定的参数调用MyClass

partial(MyClass)()根据定义,将返回MyClass的实例。你不需要检查

(虽然可以重写MyClass.__new__以返回除MyClass实例之外的其他,但这不是您需要检查的,因为partial。)

首先,class是一个保留字,所以我将使用class_(perPEP8

  1. 使用is而不是==来检查标识而不是相等(尽管它们在处理类对象时通常是相同的)

    class_ is MyClass
    

    或者,如果需要说明子类,请使用^{},其中包括class_ is MyClass的情况

    issubclass(class_, MyClass)
    
  2. 参见第1点,将class_替换为^{}

  3. 你在正确的轨道上。我会尝试将嵌套表达式展平,可能如下所示:

    departial = class_.func if isinstance(class_, partial) else class_
    departial is MyClass
    

例如:

from functools import partial

class MyClass:
    pass

for class_ in MyClass, partial(MyClass), range, partial(range):
    departial = class_.func if isinstance(class_, partial) else class_
    result = departial is MyClass
    print(result, class_)

输出:

True <class '__main__.MyClass'>
True functools.partial(<class '__main__.MyClass'>)
False <class 'range'>
False functools.partial(<class 'range'>)

相关问题 更多 >