2

是否可以将整个类(而不是实例)作为参数传递给 Python 中的另一个类方法?如果我首先有几个该类的实例,并且需要将其中的任何一个传递给第二类的方法,但没有指定哪个实例,我可以这样做:

class First():
    def __init__(self, a, b):
        pass

class Second():
    def __init__(self, c, d):
        pass
    def method(self, First):
        #and how do I call here the whole class First
        #without calling a particular instance here?
4

3 回答 3

3

直截了当。

def method(self, First):
    First() #instantiation
    First.classmethod()
    First.staticmethod()

在 python 中,类本身就是对象,所以你可以这样调用你method

second_instance.method(Any_Class_You_Want)
于 2013-04-18T21:13:42.650 回答
3

首先,您不需要在 Python 中指定类型。所以,如果你想method举个First例子,只需这样做:

class Second():
    def __init__(self, c, d):
        pass
    def method(self, first):
        pass

my_first = First(0, 1)
my_second = Second(2, 3)
my_second.method(my_first)

我相信这回答了您真正的问题,即:

如果我首先有几个该类的实例,并且需要将其中的任何一个传递给第二类的方法,但没有指定哪个实例......</p>

如果您想确保参数实际上是 First,您始终可以添加assert isinstance(first, First)orif not isinstance(first, First): raise TypeError或其他任何内容,但通常您不想在 Python 中这样做。“鸭子打字”的全部意义在于您编写了一个接受“任何像First实例一样的东西”的函数,而不是一个接受“First实例”的函数。


然后你说:

现在我需要在第二个类的方法中对 First 类的变量进行变异:

所以……就去做吧。您的示例在类中没有任何属性First,所以让我们添加一些:

class First():
    def __init__(self, a, b):
        self.total = a + b

现在,让我们使用它们Second.method

class Second():
    def __init__(self, c, d):
        self.total = c + d
    def method(self, first):
        first.total += self.total

所以:

>>> my_first = First(0, 1)
>>> my_first.total
1
>>> my_second = Second(2, 3)
>>> my_second.total
5
>>> my_first.total += 2
>>> my_first.total
3
>>> my_second.method(my_first)
>>> my_first.total
8

或者,如果你的意思是你想改变类中的属性First……你甚至不需要一个First实例:

First.my_class_attribute = 1

如果你真的需要传递一个类本身......好吧,一个类就像其他任何东西一样是一个常规值:

class Second():
    def __init__(self, c, d):
        pass
    def method(self, cls):
        pass

my_second = Second(1, 2)
my_second.method(First)

cls并且您可以访问from within的类属性method,就像在传递实例时访问实例属性一样容易。

于 2013-04-18T21:14:36.433 回答
0

你可以做:

class Model1:

    def get():
        return '1'

class Model2:
    def get(Model1):
        print('test: '+ str(Model1.get()))

if __name__ == '__main__':
    Model2.get(Model1)

输出是;:test: 1

于 2020-03-19T15:13:56.343 回答