2015-12-02 55 views
0

嗨我正在与不同的协作者在一个项目中开发一个类。我已经能够用不同的方法实现这个类,并且所有工作都正常。基本上我现在的情况是下面python类与混合@classmethod和方法

class MyClass(object): 
    def __init__(self,a,b,c): 
     self.a = a 
     self.b = b 
     self.c = c 

    def one(self,**kwargs): 
     d = self.two() 
     e = self.three() 
     # make something using a an b like 
     return 2*d + 3*e 

    def two(self,**kwargs): 
     # this uses a for example 
     return self.a*2 + self.b**self.c 
    def three(self, **kwargs): 
     # this uses b and c 
     return self.b/self.c - self.a/3 

这些显然例子,还有更多复杂的东西怎么回事。问题是,这个类只能通过

[1]: x=MyClass(a,b,c) 
[2]: y=x.one() 

类插入一个更大的项目和其他合作者想直接调用一个没有istance作为

[1]: y = MyClass.one(a,b,c) 
[2]: z = MyClass.two(a,b,c) 
[3]: x = MyClass.three(a,b,c) 

我一个实例调用知道我可以通过使用装饰器(如@classmethod)来获得此信息。例如,对于一个我不喜欢

@classmethod 
def one(cls, a, b, c): 
    d = self.two() 
    e = self.three() 
    cos(2*d+3*e) 

但其实这不工作,因为它是自没有定义引发错误。我的问题是,我不明白如果我没有创建实例,@classmethod如何调用另一个属于同一类的方法。顺便说一句我正在研究python 2.7 感谢您的任何线索。我试着在各种@classmethod问题搜索,但没有找到答案(或者也许我没有理解它)

+0

*“我不明白@classmethod如何调用另一个属于同一类的方法”* - 通过'cls'访问它。 'self'不是类方法的一部分(就像你从签名中看到的那样),你可以访问* class *,而不是* instance *。 – jonrsharpe

+1

如果你没有实例调用它,你期望'a','b'和'c'来自哪里? – user2357112

+0

你是对的我知道。对不起,如果问题太简单了,拼写错误 –

回答

0

你改名参数为cls,所以你必须在函数体改变selfcls也是。名称selfcls只是常规标识符,这是一种惯例,与例如C++的this

@classmethod 
def one(cls, a, b, c): 
    d = cls.two() 
    e = cls.three() 
    cos(2*d+3*e) 

工作方式相同

@classmethod 
def one(we_need_more_unicorns, a, b, c): 
    d = we_need_more_unicorns.two() 
    e = we_need_more_unicorns.three() 
    cos(2*d+3*e) 

或者更合理的IDENTIFER像Cls(以大写C到表示它是一个类),其有时看到了。