打电话给父母班级'在继承

时间:2016-11-17 22:34:57

标签: python

我正在阅读Usage of __slots__?的答案,我注意到其中一个例子是:

from collections import namedtuple
class MyNT(namedtuple('MyNT', 'bar baz')):
    """MyNT is an immutable and lightweight object"""
    __slots__ = ()

我看到__init__的{​​{1}}在被namedtuple

进行子类化时被调用了

我继续为自己测试并制作了这段代码,这是我第一次尝试理解这种行为:

MyNT

我收到一条错误消息,指出class objectP(): def __init__(self,name): print('object P inited') class p(objectP('asd')): pass 个对象已经通过"所以我把它改成了

4

现在产生

的输出
class objectP():
    def __init__(self,*a):
            print('object P inited')

class p(objectP('asd')):
    pass
  1. 上面的代码行是什么意思?在进行子类化时调用object P inited object P inited
  2. 为什么__init__打印两次?

1 个答案:

答案 0 :(得分:0)

您在问题顶部列出的示例代码是有效的,因为namedtuple函数(实际上不是一个类本身)返回一个类。您从该返回的类继承,而不是从namedtuple本身继承。

当您在其他代码中使用它时,相同的结构不起作用,因为调用ObjectP类会在调用它时返回一个实例,并且该实例不是可以继承的类从

可以编写一个返回类的函数,就像namedtuple一样。您还可以编写一个类,其他实例是其他类。这被称为" metatype"在Python 3中,元类型需要从type类继承。

class MyMeta(type):
    def __new__(meta, name, bases, dct):
        print("creating a new type named", name)
        return super().__new__(meta, name, bases, dct)

class MyClass1(MyMeta("Base", (), {})): # you can inherit from an instance
    pass

class MyClass2(metaclass=MyMeta): # or use the special metaclass syntax
    pass

虽然元类很整洁,但如果你对它们不熟悉,它们会有点混乱。它有点形而上学,type是它自己的一个实例(以及object的子类,以获得良好的衡量标准)。这个东西是Python类型系统的神奇核心,你并不需要理解它以普通方式使用类。