To expand on what I said in comments: match introduces a value, but case introduces a pattern to match against. It is not an expression that is evaluated. In case the pattern represents a class, the stuff in the parentheses is not passed to a constructor, but is matched against attributes of the match value. Here is an illustrative example:
class Tree:
def __init__(self, name):
self.kind = name
def what_is(t):
match t:
case Tree(kind="oak"):
return "oak"
case Tree():
return "tree"
case _:
return "shrug"
print(what_is(Tree(name="oak"))) # oak
print(what_is(Tree(name="birch"))) # tree
print(what_is(17)) # shrug
Note here that outside case, Tree(kind="oak") would be an error:
TypeError: Tree.__init__() got an unexpected keyword argument 'kind'
And, conversely, case Tree(name="oak") would never match, since Tree instances in my example would not normally have an attribute named name.
This proves that case does not invoke the constructor, even if it looks like an instantiation.
EDIT: About your second error: you wrote case type(Tree()):, and got TypeError: type() accepts 0 positional sub-patterns (1 given). What happened here is this: case type(...) is, again, specifying a pattern. It is not evaluated as an expression. It says the match value needs to be of type type (i.e. be a class), and it has to have attributes in the parentheses. For example,
match Tree:
case type(__init__=initializer):
print("Tree is a type, and this is its initializer:")
print(initializer)
This would match, and print something like
# => Tree is a type, and this is its initializer:
# <function Tree.__init__ at 0x1098593a0>
The same case would not match an object of type Tree, only the type itself!
However, you can only use keyword arguments in this example. Positional arguments are only available if you define __match_args__, like the documentation says. The type type does not define __match_args__, and since it is an immutable built-in type, case type(subpattern, ...) (subpattern! not subexpression!), unlike case type(attribute=subpattern, ...), will always produce an error.
Videos
It's a pretty nifty feature and it's a much easier to extend or extend, like selectively flattening some values in a dictionary based on the key, for instance. I've written about it extensively on Mastering Structural Pattern Matching