类方法可以在python中调用实例方法吗?

类方法可以在python中调用实例方法吗?,python,oop,Python,Oop,我正在学习编程一个二叉树,我想检查一个给定的数字是否已经在树中,所以当我尝试添加相同的数字时,它会停止 class Node: exist = True @classmethod def num_exist(cls, n): cls.exist = cls.find(n) def find(self, n): if n != self.value: if n < self.value:

我正在学习编程一个二叉树,我想检查一个给定的数字是否已经在树中,所以当我尝试添加相同的数字时,它会停止

class Node:

    exist = True

    @classmethod
    def num_exist(cls, n):
        cls.exist = cls.find(n)


    def find(self, n):

        if n != self.value:
            if n < self.value:
                if self.right != None:
                    self.right.find(n)

                else:
                    return False

            if n > self.value:
                if self.left != None:
                    self.left.find(n)

                else:
                    return False
        else:
            return self


    def add(self, n):

        self.num_exist(n)

        if self.exist == False:
            if n != self.value:
                if n < self.value:
                    if self.right != None:
                    self.add(n)

                else:
                    self.right = Node(n)

            if n > self.value:
                if self.left != None:
                    self.add(n)

                else:
                    self.left = Node(n)

我想这个错误是因为没有传递
self
参数,但我不知道如何做,或者是否可以将函数
find()
传递给
@classmethod
。我是oop的新手。

你想做的没有意义。您试图在一个给定的树中找到编号
n
,这是一个实例,那么它作为一个类方法意味着什么呢?

您试图做的事情毫无意义。您试图在给定的树中找到编号
n
,这是一个实例,那么它作为类方法意味着什么呢?

类方法可以调用实例方法吗?技术上是的,只要您传入对该实例的引用:

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

    def print_a(self):
        print(self.a)

    @classmethod
    def class_print_a(cls, inst):
        inst.print_a()

my_instance = MyClass(a=1)
MyClass.class_print_a(my_instance)  # output: 1

。。。虽然你确实应该有一个很好的理由这样做。如果您的类方法依赖于某个特定实例,那么它就不是真正的类方法。

类方法可以调用实例方法吗?技术上是的,只要您传入对该实例的引用:

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

    def print_a(self):
        print(self.a)

    @classmethod
    def class_print_a(cls, inst):
        inst.print_a()

my_instance = MyClass(a=1)
MyClass.class_print_a(my_instance)  # output: 1

。。。虽然你确实应该有一个很好的理由这样做。如果你的类方法依赖于一个特定的实例,那么它就不是一个真正的类方法。

当方法的结果明显依赖于被轮询的实例的状态时,使
num\u exist
成为一个类方法的原因是什么?是的,如果你有一个类实例的引用。但是,除非将类方法作为显式参数传递,否则类方法通常不会。当方法的结果明显取决于被轮询实例的状态时,
num_exist
classmethod的原因是什么?是的,如果您引用了类的实例。但是,除非您将一个类方法作为显式参数传递,否则类方法通常不会这样做。您是对的,确实没有意义。谢谢你的回答!你说得对,真的没道理。谢谢你的回答!