如何在类方法中创建类实例?

10

我希望在类内部创建类实例。我尝试了以下方式:

class matrix:
    (...)
    def det(self):
        (...)
        m = self(sz-1, sz-1)
        (...)
    (...)
但是我遇到了错误:
m = self(sz-1, sz-1)

属性错误:矩阵实例没有__call__方法。

所以,我尝试通过这种方式来实现:


class matrix:
    (...)
    def det(self):
        (...)
        m = matrix(sz-1, sz-1)
        (...)
    (...)
我收到了另一个错误:
m = matrix(sz-1, sz-1)

NameError: 全局名称'matrix'未定义


3
最后一个例子对我来说有效。 - Javier
按照您现在的写法,'m' 将是一个局部变量,而不是实例变量,因此当 det() 方法返回时,它将消失。这可能适用于您正在做的事情,但是当您说您想要一个“类实例内部的自身”时,似乎您希望 'm' 成为实例变量,在这种情况下,您需要将其称为 "self.m"。 - Tyler
你使用的是哪个版本的Python? - Tyler
最后一个例子在我的Python 2.6.4中可以工作。我不会期望其他的事情发生... - Eric O. Lebigot
最后一个例子可能可以工作,如果矩阵是全局类,但它不是。也许在Python 2.6中它可以工作,我不知道,我正在使用2.5.4。'm'是本地变量,因为我不需要在det()方法之外使用它 - 我以递归方式计算矩阵行列式。 - pablo
1个回答

15
m = self.__class__(sz-1, sz-1)
或者
m = type(self)(sz-1, sz-1)

1
好吧,但是type(self)是一个矩阵,不是吗?那么为什么Pablo的第二个例子不起作用呢?在Python中,难道不能从类内部引用自身这就是生活的事实吗? - Tyler
我要删除我的hack答案,转而使用这个宝石(gem)。 - manifest
type(self)() 对我不起作用,但是 self.class() 正常工作,而且这就是我需要的一切。谢谢 ;) - pablo
@MatrixFrog:对于“旧式”类(不继承自object的Python2类),type(self)始终只是<type 'instance'>。元类/新式类的目的是使用户能够创建“真正”的类型。 - bukzor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接