gpt4 book ai didi

python - 从另一个类方法调用类方法或常规方法之间的区别

转载 作者:行者123 更新时间:2023-12-01 04:26:11 24 4
gpt4 key购买 nike

我已经潜伏了很长时间,碰巧这是我第一次提出问题,因为我在任何地方都找不到答案。我真的希望这个标题不要那么令人困惑,我不知道还能怎么命名它。

我正在研究我的大学项目所需的矩阵类(LUP 分解、矩阵求逆、求解线性方程...)。基本的矩阵运算、运算符重载、一些辅助方法,没有什么太花哨的。

当我编写代码时,我想到了一些让我困扰的事情。我有一个私有(private)方法_makeMatrix。该方法创建预期的 Matrix 对象。然后,我有像 createFromListcreateFromFile 这样的类方法以及类似的基本方法,允许以不同的方式创建 Matrix 对象。所有这些方法都调用_makeMatrix来实际创建Matrix对象。

所以,我的问题是,这两者之间有什么区别,除了在第二种情况下我可以调用 _makeMatrix 而不创建对象(我显然不想这样做,因为 _makeMatrix 旨在保密):

def _makeMatrix(r):
# some code that creates Matrix object m
return m

@classmethod
def createFromList(cls, matxList)
# code that makes matxList suitable for passing to _makeMatrix()
r = matxList
return Matrix._makeMatrix(r)

@classmethod
def _makeMatrix(cls, r):
# some code that creates Matrix object m
return m

@classmethod
def createFromList(cls, matxList)
# code that makes matxList suitable for passing to _makeMatrix()
r = matxList
return cls._makeMatrix(r)

这两种方法之间的确切区别是什么?使用一种或另一种方法有什么优点/缺点吗?

最佳答案

此示例的正确装饰器应该是staticmethod。原因如下:

class MyClass:
@classmethod
def foo(cls, arg):
# Here I can reference the class to work on things related to it
# even if it is being accessed by an object of this class
pass


@staticmethod
def bar(arg):
# This one behaves as a pure function unaware of the class it is
# located on; even if it is accessed by an object of this class
pass


def baz(arg):
# This one is tricky. Because it has no "self", it should crash
# when accessed by an object of the class but not on the class
# itself!
pass

测试:

x = MyClass()
x.foo(10) # OK, but `cls` is unused
x.bar(10) # OK!
x.baz(10) # Crash!!

MyClass.foo(10) # Ok, but `cls` is unused
MyClass.bar(10) # OK!
MyClass.baz(10) # OK!

因此,每当您在类中需要一个“纯”函数时,即不需要来自所插入的类的任何信息的函数,这应该是一个staticmethod。如果您不想实例化对象但需要类中的一些信息,则需要 classmethod

关于python - 从另一个类方法调用类方法或常规方法之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33112611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com