Python中的"类型"和"对象"之间有什么区别

cla*_*dio 18 python types object

我发现这个关于关键字的python 文档super:

如果省略第二个参数,则返回的超级对象是未绑定的.如果第二个参数是对象,则isinstance(obj,type)必须为true.如果第二个参数是一个类型,则issubclass(type2,type)必须为true(这对于classmethods很有用).

有人可以给我一个例子,区分传递Type作为第二个参数与传递Object之间的区别吗?

文档是否在讨论对象的实例?

谢谢.

Blc*_*ght 8

Python的super函数根据其参数不同而做不同的事情。这是使用它的不同方式的演示:

class Base(object):
    def __init__(self, val):
        self.val = val

    @classmethod
    def make_obj(cls, val):
        return cls(val+1)

class Derived(Base):
    def __init__(self, val):
        # In this super call, the second argument "self" is an object.
        # The result acts like an object of the Base class.
        super(Derived, self).__init__(val+2)

    @classmethod
    def make_obj(cls, val):
        # In this super call, the second argument "cls" is a type.
        # The result acts like the Base class itself.
        return super(Derived, cls).make_obj(val)
Run Code Online (Sandbox Code Playgroud)

测试输出:

>>> b1 = Base(0)
>>> b1.val
0
>>> b2 = Base.make_obj(0)
>>> b2.val
1
>>> d1 = Derived(0)
>>> d1.val
2
>>> d2 = Derived.make_obj(0)
>>> d2.val
3
Run Code Online (Sandbox Code Playgroud)

3结果是先前改性剂的组合:1(从Base.make_obj)加上2(从Derived.__init__)。

请注意,可以super仅使用一个参数进行调用即可获取“未绑定”的超级对象,这显然没有太多用处。除非您想弄乱Python内部结构并且您真的知道自己在做什么,否则实际上没有任何理由这样做。

在Python 3中,您也可以super不带任何参数进行调用(这等效于上面函数中的调用,但是更神奇)。


小智 0

对象可以是任何 Python 类实例,可以是也可以不是用户定义的。但是,当您谈论 type 时​​指的是默认对象/集合,例如 list/tuple/dict/int/str 等。