混合@classmethod和方法的python类

python class with mixed @classmethod and methods

嗨,我正在与不同的合作者一起开发一个项目中的类。我已经能够用不同的方法实现类,并且所有的方法都正常工作。基本上我的现状是

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
2
[1]: x=MyClass(a,b,c)
[2]: y=x.one()

类被插入到一个更大的项目中,其他合作者希望直接调用一个不带Isance的项目作为

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

我知道我可以通过使用像@classmethod这样的装饰器来获得它。比如说一个我喜欢的

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

但这实际上不起作用,因为它会引发一个错误,因为自我并没有被定义。我的问题是,如果我没有创建实例,@class method如何调用同一类中的另一个方法。顺便说一句,我正在开发python 2.7谢谢你的提示。我试图搜索各种@classmethod问题,但没有找到答案(或者我可能不理解)。


您将参数重命名为cls,因此您也必须将函数体中的self更改为cls。EDOCX1 1和EDCOX1 0的名称只是普通标识符,一个约定,不同于C++的EDCOX1×5。

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

工作原理与

1
2
3
4
5
@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)

或者像cls这样更合理的标识符(用大写字母c表示它是一个类),有时也会看到。