How to pass an bpy.data.objects bpt.data.materials etc to an operator, from layout?
Add  context members for your op to use.
Would assume you tried
    object: PointerProperty(type=bpy.types.Object) 

only to get the error message saying you can't assign datablock pointers to an operator.... possibly explains why you never see this used in any operator. The idea is to use the operator / context paradigm and use context to reference objects
UILayout.context_pointer_set
Consider using context for this. Instead of passing it as an operator variable set a context member, in this case &quot;foo&quot; and use that in your operator.
Simple example that adds a row with button for each scene object. Each row has the context pointer &quot;foo&quot; set to respective object.
import bpy
from bpy.props import StringProperty, PointerProperty


class SimpleOperator(bpy.types.Operator):
    
    bl_idname = &quot;object.simple_operator&quot;
    bl_label = &quot;Simple Object Operator&quot;    
    
    # This throws an error, because cannot save datablock ref to operator.
    #object: PointerProperty(type=bpy.types.Object)
    
    @classmethod
    def poll(cls, context):
        return getattr(context, &quot;foo&quot;, False)

    def execute(self, context):
        
        #I can find the object like this:
        ob = context.foo
        print(ob)
        
        return {'FINISHED'}


class HelloWorldPanel(bpy.types.Panel):
    &quot;&quot;&quot;Creates a Panel in the Object properties window&quot;&quot;&quot;
    bl_label = &quot;Hello World Panel&quot;
    bl_idname = &quot;OBJECT_PT_hello&quot;
    bl_space_type = 'PROPERTIES'
    bl_region_type = 'WINDOW'
    bl_context = &quot;object&quot;

    def draw(self, context):
        ob = context.object
        
        layout = self.layout
        for ob in context.scene.objects:
            row = layout.row()
            row.context_pointer_set(name=&quot;foo&quot;, data=ob)
            row.operator(&quot;object.simple_operator&quot;, text=ob.name)


def register():
    bpy.utils.register_class(SimpleOperator)
    bpy.utils.register_class(HelloWorldPanel)

def unregister():
    bpy.utils.unregister_class(SimpleOperator)
    bpy.utils.unregister_class(HelloWorldPanel)

if __name__ == &quot;__main__&quot;:
    register()

Have used context.foo by way of example, because it is not a standard context member would recommend using
ob = getattr(context, &quot;foo&quot;, None)

to give a null value when not set. have polled against it to disable operator if &quot;foo&quot; is not set.