2

一个新手的问​​题,我尝试使用装饰器@classmethod 在方法中调用一个方法,知道如何实现这一点吗?例如我有:

class A():
    def B(self):
    #do something
    return something

    @classmethod
    def C(cls):
    #do something
    x = B() #call B method
    return None

我有一个错误:

NameError: global name 'B' is not defined

我可以调用 B 还是我也将 B 定义为类方法?

4

3 回答 3

1

这里的问题不是你的函数是“用户定义的”,问题是“x=B()”没有在你的类中调用一个名为“B”的方法,它在你的类中调用了一个名为“B”的方法全局命名空间。

为了说明发生了什么,请查看以下代码:

B="1"

class A():
    B="2"

    def myfunc(cls):
        print B

a = A()
a.myfunc()

如果你运行它,你会看到输出是1.

如果您将print语句更改为,print A.B您将得到2.

在您的情况下,您需要打电话A.B()而不是简单地打电话B()

但是,正如其他人指出的那样,B()它是一个实例方法。它期望它传递的第一个参数是该类的一个实例。根据 B 所做的事情,您很可能会因为没有实例来传递它而遇到问题。您可以通过传递一些其他对象(例如类本身)或创建一个新对象来以各种方式解决此问题;但在我看来,如果 C() 需要调用实例方法,则 C() 本身应该是实例方法。

类和实例方法的区别讲了类和实例方法的区别。

于 2014-07-11T22:50:28.420 回答
0

类方法是不需要实例数据的方法。如果 B 需要 using 所暗示的实例数据self,则 A 不应该是类方法。如果 B 不需要实例数据,您可以将其定义为类方法并使用 cls.B() 调用它。

于 2014-07-11T22:34:44.773 回答
0

要完成这项工作,您需要执行以下操作:

class A():

    def B(self):
        #do something (with self! so this requires A to be instantiated!)
        return something

    @classmethod
    def C(cls):
        #do something
        return cls().B() #instantiate class, call B method, and return results 
于 2014-07-11T22:47:31.927 回答