我正在阅读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
object P inited
object P inited
?__init__
打印两次?答案 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类型系统的神奇核心,你并不需要理解它以普通方式使用类。