python定义的class函数怎么调用_[python]我们可以在@classmethod函数内部调用用户定义的实例方法吗?...

一个新手问的问题是,我试着用decorator@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定义为类方法吗?

这是一个实例方法。如果没有实例,如何调用它?如果您有一个实例,那么另一方面(可能是在do something期间创建的,或者是从其他来源获得的),它是微不足道的。

有人需要把这些标签合并成同义词。

根据您代码中的定义,B是A的成员,采用单个参数(self)。如果x是A对象,那么x.B()只是A.B(x)的语法糖。因此,您需要通过包含类引用您的函数,并传递正确数量的参数。

这里的问题不是您的函数是"用户定义的",而是"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()应该是一个实例方法本身。

类方法和实例方法之间的区别说明了类方法和实例方法之间的区别。

要使其工作,您需要这样做:

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

类方法是不需要实例数据的方法。如果B需要使用self所隐含的实例数据,那么A不应该是类方法。如果B不需要实例数据,可以将其定义为类方法,并使用cls.b()调用它。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值