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必须是类型或类型的元组
给定以下两个.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) 使用整数时,有多种可用类型(例如 int、numpy.int8、numpy.int16 等)。如果我编写一个通用函数,要求一个变量为整数,我如何针对 Python/numpy 中所有可能的“整数”类型测试该类型?关于浮动也可以提出同样的问题。我最初是这么想的
isinstance(np.int64(5), int)
Run Code Online (Sandbox Code Playgroud)
会/应该起作用,但事实并非如此。
有没有办法可以测试所有可用整数类型的整数变量?
使用 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的问题.
我有变量a,b,c和d.
我有以下几行:
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需要类的实例对象和类信息.问题是:我只有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是什么,因为它是一个变量.我无法初始化它,因为我不知道它需要什么参数,它也可能做一些讨厌的事情.(而且我永远不需要初始化这个变量,因为它是一种测试).
问题是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) 我有几节课
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)
有没有更好、更干净的方法来做到这一点?
我试图使我的类作为另一个对象出现,以规避正在使用的程序包中的惰性类型检查。更具体地说,我试图使我的对象作为另一个对象的实例出现(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)
我究竟做错了什么?
我想知道如何检查变量是否为 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'>直接访问呢?
isinstance ×10
python ×10
python-3.x ×3
datetime ×1
decorator ×1
django ×1
gmpy ×1
import ×1
inheritance ×1
instanceof ×1
metaclass ×1
numpy ×1
recursion ×1
reload ×1
subclass ×1
timezone ×1
types ×1