【发布时间】:2017-06-01 20:59:47
【问题描述】:
我正在研究基于 python 3 的元类,因为我理解元类是 typedef
属于一类。这是一个小例子
class smallClass(type):
def __init__(self, clsname, bases, clsdict):
super(smallClass, self).__init__(clsname, bases, clsdict)
self.a = 10
self.b = 15
print(self.addnos())
def addnos(self):
return self.a + self.b
def __new__(self, clsname, bases, clsdict):
return super(smallClass, self).__new__(self, clsname, bases, clsdict)
class smallClass2(object, metaclass=smallClass):
la = smallClass.addnos
clstest = smallClass2()
clstest.addnos() ''' this does not work: AttributeError: 'smallClass2' object has no attribute 'addnos' '''
奇怪的是函数 addnos 在 smallClass2 中是不可见的,即使它基于包含 addnos 函数的元类 smallClass
有人可以帮助理解如何访问元类中定义的函数吗?或者为什么 clstest.addnos() 不起作用?
函数 addnos 可以从元类访问,但不能从派生类访问,为什么?
这里换个方法试试,有同样的问题
class smallClass(type):
def __init__(self, clsname, bases, clsdict):
super(smallClass, self).__init__(clsname, bases, clsdict)
self.a = 10
self.b = 15
print(self.addnos())
def addnos(self):
return self.a + self.b
def __new__(self, clsname, bases, clsdict):
return super(smallClass, self).__new__(self, clsname, bases, clsdict)
class smallClass2(object, metaclass=smallClass):
pass
clstest = smallClass2()
clstest.addnos()
【问题讨论】:
-
我的问题是为什么 clstest.addnos() 不起作用?
-
当您将
smallClass.addnos分配给la时,您在smallClass2的字典中显式地为该函数创建了一个附加名称。没有它,尝试访问clstest.addnos会失败,因为在实例上执行属性查找时不会参考元类。 -
Jim,感谢您的快速回复 print(clstest.la()) 的工作是测量函数 addnos 仍然属于 smallClass 并且它不会传播到 smallClass2。我没想到会这样
标签: python-3.x metaclass