标签: isinstance

使'isinstance'与装饰器一起工作

Python isinstance函数如何在内部工作?我可以做些什么来改变它的结果,比如在类中定义一个特殊的函数还是什么?这是我的用例:

class Decorator:
    def __init__(self, decorated):
        self._decorated = decorated

    def __call__(self):
        return self._decorated()

@Decorator
class Foo:
    pass

f = Foo()

# How can I make this be true?
isinstance(f, Foo)
Run Code Online (Sandbox Code Playgroud)

Decorator除了混合在这里不合适之外,它几乎就像混合物一样.有什么方法可以让上面的代码工作吗?我还应该注意该isinstance行也会出现以下错误:

    isinstance(f,Foo)
TypeError:isinstance()arg 2必须是类型或类型的元组

python decorator isinstance

2
推荐指数
1
解决办法
660
查看次数

模块重新加载时的isinstance行为

给定以下两个.py文件:

aclass.py

class A(object):
    pass
Run Code Online (Sandbox Code Playgroud)

main.py

def importer(klass):
    """
    Used to import classes from there python qalname
    """
    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
    klass = klass.split('.')
    module = '.'.join(klass[:-1])
    klass = klass[-1]
    return import_(module, klass)

from aclass import A

import_A = importer('aclass.A')
print isinstance(A(), import_A)  # Expected to be true 
print isinstance(import_A(), A)  # Expected to be true 
Run Code Online (Sandbox Code Playgroud)

在此阶段,一切正常(我的程序打印True\nTrue),但是如果我修改importer方法以强制重新加载,即:

这行:

    import_ = lambda m, k: getattr(__import__(m, fromlist=k), k)
Run Code Online (Sandbox Code Playgroud)

替换为:

    import_ = lambda m, …
Run Code Online (Sandbox Code Playgroud)

python import reload isinstance

2
推荐指数
1
解决办法
701
查看次数

如何使用 isinstance 测试所有可能的整数类型

使用整数时,有多种可用类型(例如 int、numpy.int8、numpy.int16 等)。如果我编写一个通用函数,要求一个变量为整数,我如何针对 Python/numpy 中所有可能的“整数”类型测试该类型?关于浮动也可以提出同样的问题。我最初是这么想的

isinstance(np.int64(5), int)
Run Code Online (Sandbox Code Playgroud)

会/应该起作用,但事实并非如此。

有没有办法可以测试所有可用整数类型的整数变量?

python types numpy isinstance python-3.x

2
推荐指数
2
解决办法
1248
查看次数

Python的isinstance方法结果对于子类实例是意外的

使用 Python 的 isinstance 方法时,定义两个类(两个单独的文件中的基类“ClassA”和子类“ClassB”)会产生意外结果。输出似乎受到运行时使用的模块名称(命名空间?)的影响(__main__)。此行为出现在 Python 3.8.5 和 3.10.4 上。

文件 ClassA.py 包含:

class ClassA:
    def __init__(self, id):
        self.id = id
    def __str__(self) -> str:
        class_name = type(self).__name__
        return f"{class_name} WITH id: {self.id}"

def main():
    from ClassB import ClassB
    id = 42
    for i, instance in enumerate([ClassA(id), ClassB(id)]):
        label = f"{type(instance).__name__}:"
        print("#" * 50)
        print(f"{label}   type: {type(instance)}")
        label = " " * len(label)  # Convert label to appropriate number of spaces
        is_a = isinstance(instance, ClassA)
        is_b = isinstance(instance, ClassB)
        print(f"{label} …
Run Code Online (Sandbox Code Playgroud)

python program-entry-point subclass isinstance

2
推荐指数
1
解决办法
115
查看次数

Python:检查变量的类型

我有一个关于python的问题.

我有变量a,b,cd.

我有以下几行:

if    not isinstance(a, int)   or not isinstance(b, int)  \
   or not isinstance(c, int)   or not isinstance(d, int)  \
   or not isinstance(a, float) or not isinstance(b, float)\
   or not isinstance(c, float) or not isinstance(d, float):
    do something
Run Code Online (Sandbox Code Playgroud)

是否可以缩短此代码?

谢谢!

python isinstance

1
推荐指数
1
解决办法
335
查看次数

Python - isinstance(classInfo,classInfo)

Python文档说isinstance需要类的实例对象和类信息.问题是:我只有2个类信息对象,必须检查class_inf1是否是class_inf2的一个实例

例:

class Foo(object):
    pass

class Bar(Foo):
    pass

# It should check if Bar is a instance of Foo. Bar can either be one of many subclasses or 
# the same class.
isinstance(Bar, Foo)

# i.e.: the function I'm looking for should be working as if Bar was an object:
isinstance(Bar(), Foo)
Run Code Online (Sandbox Code Playgroud)

在我更复杂的代码中,我不知道Bar是什么,因为它是一个变量.我无法初始化它,因为我不知道它需要什么参数,它也可能做一些讨厌的事情.(而且我永远不需要初始化这个变量,因为它是一种测试).

python instanceof isinstance

1
推荐指数
1
解决办法
2507
查看次数

在Python中,为什么isinstance函数说datetime是datetime.date的一个实例?

问题是isinstance函数说datetime.datetime实例也是datetime.date的实例

为什么?那讲得通?

Python 2.7.4 (default, Sep 26 2013, 03:20:26) 
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import datetime
>>> d = datetime.datetime(2014, 4, 30, 15, 9, 4, 218466)
>>> isinstance(d, datetime.datetime)
True
>>> isinstance(d, datetime.date)
True
Run Code Online (Sandbox Code Playgroud)

这使得Django 1.4.10(我没有检查其他版本)错误地提出一个RuntimeWarning说一些完全时区感知的日期时间不是,因为有一个规则(这里)说日期实例总是天真的.在django/db/models/fields/init .py,第759行引发警告.可能这是由于对"日期类型的对象总是天真的"这一短语的误解,他们应该使用类型函数比较检查类型而不是使用insinstance(甚至更好,使用django.utils.timezone.is_aware函数).

那么这是一个Django错误,还是bug是关于python isinstance函数的行为?或两者?或者只是我?

>>> from django.utils.timezone import is_aware, utc
>>> d = datetime.datetime(2014, 4, 30).replace(tzinfo=utc)
>>> is_aware(d)
True
>>> isinstance(d, datetime.date)
True
Run Code Online (Sandbox Code Playgroud)

python django timezone datetime isinstance

1
推荐指数
1
解决办法
471
查看次数

Python:如何使用父级的 isinstance 来确定它是否是特定的子级

我有几节课

class Parent():
    def DoThing():
        if isinstance(self, 'child1'):
            DoSomething()
        elif:
            DoSomethingElse()

import Parent
class Child1(Parent):
    def DoThing():
        #Do some things here
        super.DoThing()

import Parent
class Child2(Parent)
    def DoThing():
        #Do other things
        super.DoThing()
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我想检查该类的实例是父级本身还是子级之一。

失败点是在解释 Parent 时,该过程失败,因为解释器不知道 Child1 是什么。我无法导入 Child1,因为这会导致递归。

我通过在parent和child1中定义一个方法来解决这个问题。

def IsChild1Instance(self):
    return True/False
Run Code Online (Sandbox Code Playgroud)

有没有更好、更干净的方法来做到这一点?

python recursion inheritance isinstance

1
推荐指数
1
解决办法
1394
查看次数

__instancecheck__-覆盖不起作用-我在做什么错?

我试图使我的类作为另一个对象出现,以规避正在使用的程序包中的惰性类型检查。更具体地说,我试图使我的对象作为另一个对象的实例出现(tuple在我的情况下),而实际上它甚至不是该对象的派生。

为了实现这一目标,我计划重写该__isinstance__方法,根据docs,该方法应该完全按照我的意愿进行。但是,由于我的尝试未成功,因此我似乎不知道该怎么做。

这是一个SSCCE,应该在所有情况下可以isinstance回报False,但不能回报。

class FalseInstance(type):
    def __instancecheck__(self, instance):
        return False

class Foo(metaclass=FalseInstance):
    pass

g = Foo()
isinstance(g, Foo)
> True
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

python metaclass magic-methods isinstance python-3.x

1
推荐指数
2
解决办法
367
查看次数

如何检查变量是否是 Python 3 中 mpfr 的实例?

我想知道如何检查变量是否为 mpfr 类型,这可能听起来微不足道,但简单的方法isinstance(v, mpfr)无法解决问题。

示例:创建一个 mpfr 实例的变量,如何验证该变量是 mpfr 的实例?

import gmpy2
from gmpy2 import mpfr

f = mpfr('0.5')
Run Code Online (Sandbox Code Playgroud)

最直观的方法失败了:

>>> isinstance(TAU, mpfr)
TypeError: isinstance() arg 2 must be a type or tuple of types
Run Code Online (Sandbox Code Playgroud)

因为mpfr是一个函数:

>>> mpfr
<function gmpy2.mpfr>
Run Code Online (Sandbox Code Playgroud)

gmpy2只有一个名为 的属性mpfr,它就是上面的函数。

然而,函数输出的类mpfr也称为mpfr

>>> f.__class__
mpfr
Run Code Online (Sandbox Code Playgroud)

但这mpfr不是mpfr主命名空间中的函数:

>>> type(f) == mpfr
False
Run Code Online (Sandbox Code Playgroud)

到目前为止,我只能mpfr通过创建一个空mpfr实例并使用其__class__属性来检查变量是否是 的实例:

isinstance(f, mpfr().__class__)
Run Code Online (Sandbox Code Playgroud)

怎样才能<class 'mpfr'>直接访问呢?

python isinstance python-3.x gmpy

1
推荐指数
1
解决办法
114
查看次数