Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 类型(obj)和obj类之间的差异___Python_New Style Class - Fatal编程技术网

Python 类型(obj)和obj类之间的差异__

Python 类型(obj)和obj类之间的差异__,python,new-style-class,Python,New Style Class,type(obj)和obj.\uuuu class\uuuu之间有什么区别?是否有可能类型(obj)不是obj.\uuuuu类\uuuuuu 我想编写一个在提供的对象上通用的函数,使用与另一个参数相同类型的默认值1。下面的第1个或第2个变量是正确的 def f(a, b=None): if b is None: b = type(a)(1) # #1 b = a.__class__(1) # #2 问题出在老式课程上,唉: >>> class old: p

type(obj)
obj.\uuuu class\uuuu
之间有什么区别?是否有可能
类型(obj)不是obj.\uuuuu类\uuuuuu

我想编写一个在提供的对象上通用的函数,使用与另一个参数相同类型的默认值1。下面的第1个或第2个变量是正确的

def f(a, b=None):
  if b is None:
    b = type(a)(1) # #1
    b = a.__class__(1) # #2

问题出在老式课程上,唉:

>>> class old: pass
... 
>>> x=old()
>>> type(x)
<type 'instance'>
>>> x.__class__
<class __main__.old at 0x6a150>
>>> 
>>旧类:通过
... 
>>>x=旧的()
>>>类型(x)
>>>x.。_u类__
>>> 
在Python3中不是问题,因为现在所有的类都是新的样式;-)

在Python 2中,一个类只有从另一个新样式类(包括
对象
和各种内置类型,如
dict
list
set
,…)继承,或者隐式或显式地将
元类设置为
类型
类型(obj),才是新样式
类型。对于旧式类,类的行为不同:

>>> class a(object):
...     pass
...
>>> class b(a):
...     pass
...
>>> class c:
...     pass
...
>>> ai=a()
>>> bi=b()
>>> ci=c()
>>> type(ai) is ai.__class__
True
>>> type(bi) is bi.__class__
True
>>> type(ci) is ci.__class__
False

这是一个老问题,但似乎没有一个答案提到这一点。在一般情况下,对于一个新样式的类来说,
类型(实例)
实例可能有不同的值

class ClassA(object):
    def display(self):
        print("ClassA")

class ClassB(object):
    __class__ = ClassA

    def display(self):
        print("ClassB")

instance = ClassB()

print(type(instance))
print(instance.__class__)
instance.display()
输出:

<class '__main__.ClassB'>
<class '__main__.ClassA'>
ClassB

B类

原因是
ClassB
正在重写
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
type(instance)
直接从该类型字段读取,因此它返回正确的值,而
instance.\uuuuu class\uuuu
指的是新的描述符,替换Python提供的原始描述符,后者读取内部类型字段。它不会读取内部类型字段,而是返回一个硬编码的值。

最大的讽刺是yairchu的注释现在也有同样的问题,因为他们切换了格式展示一下他们的行为是如何不同的,也许还有原因,这没什么害处。仅仅说他们的行为不同听起来是一个懒惰的回答,即使正确。值得一提的是,这只是Python 2中的问题。在Python3中,这三个表达式都是正确的!您可能会导致使用
\uuuuu class\uuuuuuuu
的行中的代码中断。也会受到
\uuuuuu getattribute\uuuuuuuuu
的影响,它会截取对
对象的请求。uuuuu class\uuuuuuuuuuuu
而不是对
类型(OBJ)
的请求。有些代码故意这样做是为了隐瞒对象的类型,例如
weakref.proxy
。有些人认为应该首选
obj.\uuuu class\uuu
,因为它相信谎言,而有些人认为
type(obj)
应该首选,因为它忽略谎言<如果对象的real类或lie类是第二个参数的实例,则code>isinstance
将返回true。@BenjaminHodgson这主要说明了为什么magic
uu
属性首先不应被重写…现在是Python 3时代,我们应该使用哪一个?如果您的代码遵循Alex描述的最佳实践,
type()
更好。在Python3中,它始终遵循最佳实践,因此在Python3中使用type()。@Aronhall如果我在编写Python2代码时知道它只会被新样式类的实例调用,那么我是否可以正确地假设使用
type()
也比使用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu类
更受欢迎?@kasperd Yes,如果您的代码总是从对象继承,那么使用
type()
@Alex Martelli@AaronHall可以安全地使用内置函数
type(instance)
和属性
instance.\uuuu class\uuuuu
可以不同,即使如Guido所述:“
isinstance(x,B)
相当于
IsubClass(x.\uu class\uuu,B)”或者issubclass(type(x),B)
(有可能
type(x)
x.。uuu class_uuu
不是同一个对象,例如当
x
是代理对象时。),正如@Flavien的回答所示。