这个问题已经有了一个答案:
-
Python中的元类是什么?14答案
我偶然发现这条巨蟒文献资料在super关键词:
如果省略了第二个参数,则返回的超级对象将被解除绑定。如果第二个参数是对象,则isinstation(obj,type)必须为true。如果第二个参数是类型,则issubclass(type 2,type)必须是true(这对于classMethod很有用)。
有人能给我一个例子,说明将Type作为第二个参数传递与传递对象之间的区别吗?
文档是在谈论对象的实例吗?
谢谢。
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)
测试输出:
>>> 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
这个3结果是前一个修饰符的组合:1(从Base.make_obj)加2(来自Derived.__init__ ).
请注意,可以调用super只有一个论点来获得一个“未绑定”的超级对象,它显然没有多大用处。没有真正的理由这样做,除非你想搞乱Python内部和你真的知道你在做什么。
在Python 3中,您还可以调用super没有参数(这相当于提供当前类和self作为两个论点,但更神奇)。
我还有许多干货带给你们,干货主要有:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python所有知识点汇总(可以弄清楚Python的所有方向和技术)
*如果你用得到的话可以直接拿走,在我的QQ技术交流群里,可以自助拿走,群号是1046656332。