diff --git a/numpydoc/validate.py b/numpydoc/validate.py
index 2cd1125..e98d385 100644
--- a/numpydoc/validate.py
+++ b/numpydoc/validate.py
@@ -280,7 +280,13 @@ class Validator:
         File name where the object is implemented (e.g. pandas/core/frame.py).
         """
         try:
-            fname = inspect.getsourcefile(self.code_obj)
+            if isinstance(self.code_obj, property):
+                fname = inspect.getsourcefile(self.code_obj.fget)
+            elif isinstance(self.code_obj, functools.cached_property):
+                fname = inspect.getsourcefile(self.code_obj.func)
+            else:
+                fname = inspect.getsourcefile(self.code_obj)
+
         except TypeError:
             # In some cases the object is something complex like a cython
             # object that can't be easily introspected. An it's better to
@@ -295,7 +301,12 @@ class Validator:
         Number of line where the object is defined in its file.
         """
         try:
-            sourcelines = inspect.getsourcelines(self.code_obj)
+            if isinstance(self.code_obj, property):
+                sourcelines = inspect.getsourcelines(self.code_obj.fget)
+            elif isinstance(self.code_obj, functools.cached_property):
+                sourcelines = inspect.getsourcelines(self.code_obj.func)
+            else:
+                sourcelines = inspect.getsourcelines(self.code_obj)
             # getsourcelines will return the line of the first decorator found for the
             # current function. We have to find the def declaration after that.
             def_line = next(

diff --git a/numpydoc/tests/test_validate.py b/numpydoc/tests/test_validate.py
index 5f76cd9..68040ad 100644
--- a/numpydoc/tests/test_validate.py
+++ b/numpydoc/tests/test_validate.py
@@ -1,7 +1,8 @@
 import pytest
 import sys
 import warnings
-from inspect import getsourcelines
+from functools import cached_property
+from inspect import getsourcelines, getsourcefile
 
 from numpydoc import validate
 import numpydoc.tests
@@ -1541,8 +1542,12 @@ class DecoratorClass:
     """
     Class and methods with decorators.
 
-    `DecoratorClass` has two decorators, `DecoratorClass.test_no_decorator` has no
-    decorator and `DecoratorClass.test_three_decorators` has three decorators.
+    * `DecoratorClass` has two decorators.
+    * `DecoratorClass.test_no_decorator` has no decorator.
+    * `DecoratorClass.test_property` has a `@property` decorator.
+    * `DecoratorClass.test_cached_property` has a `@cached_property` decorator.
+    * `DecoratorClass.test_three_decorators` has three decorators.
+
     `Validator.source_file_def_line` should return the `def` or `class` line number, not
     the line of the first decorator.
     """
@@ -1551,6 +1556,16 @@ class DecoratorClass:
         """Test method without decorators."""
         pass
 
+    @property
+    def test_property(self):
+        """Test property method."""
+        pass
+
+    @cached_property
+    def test_cached_property(self):
+        """Test property method."""
+        pass
+
     @decorator
     @decorator
     @decorator
@@ -1577,7 +1592,7 @@ class TestValidatorClass:
             numpydoc.validate.Validator._load_obj(invalid_name)
 
     # inspect.getsourcelines does not return class decorators for Python 3.8. This was
-    # fixed starting with 3.9: https://github.com/python/cpython/issues/60060
+    # fixed starting with 3.9: https://github.com/python/cpython/issues/60060.
     @pytest.mark.parametrize(
         ["decorated_obj", "def_line"],
         [
@@ -1590,6 +1605,14 @@ class TestValidatorClass:
                 "numpydoc.tests.test_validate.DecoratorClass.test_no_decorator",
                 getsourcelines(DecoratorClass.test_no_decorator)[-1],
             ],
+            [
+                "numpydoc.tests.test_validate.DecoratorClass.test_property",
+                getsourcelines(DecoratorClass.test_property.fget)[-1] + 1,
+            ],
+            [
+                "numpydoc.tests.test_validate.DecoratorClass.test_cached_property",
+                getsourcelines(DecoratorClass.test_cached_property.func)[-1] + 1,
+            ],
             [
                 "numpydoc.tests.test_validate.DecoratorClass.test_three_decorators",
                 getsourcelines(DecoratorClass.test_three_decorators)[-1] + 3,
@@ -1603,3 +1626,24 @@ class TestValidatorClass:
             )
         )
         assert doc.source_file_def_line == def_line
+
+    @pytest.mark.parametrize(
+        ["property", "file_name"],
+        [
+            [
+                "numpydoc.tests.test_validate.DecoratorClass.test_property",
+                getsourcefile(DecoratorClass.test_property.fget),
+            ],
+            [
+                "numpydoc.tests.test_validate.DecoratorClass.test_cached_property",
+                getsourcefile(DecoratorClass.test_cached_property.func),
+            ],
+        ],
+    )
+    def test_source_file_name_with_properties(self, property, file_name):
+        doc = numpydoc.validate.Validator(
+            numpydoc.docscrape.get_doc_object(
+                numpydoc.validate.Validator._load_obj(property)
+            )
+        )
+        assert doc.source_file_name == file_name

`numpydoc ignore` inline comment not recognized when using decorators
When using decorators, the `numpydoc ignore` inline comment does not seem to be recognized by either `numpydoc --validate` or the validation during Sphinx build. Here's a reprex, stored as `test.py`:

```python
import functools


def test_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        return func(*args, **kwargs)

    return wrapper


@test_decorator
def test_function():  # numpydoc ignore=PR02
    """Test.

    Parameters
    ----------
    x : int
        Test.
    """
    print("test")
```

Using `python -m numpydoc --validate test.test_function` raises the warning `test.test_function:PR02:Unknown parameters {'x'}` when the decorator is used, but doesn't when the decorator is removed. Same thing when using validation during a Sphinx build. Interestingly, validation using `python -m numpydoc.hooks.validate_docstrings test.py` does not raise the PR02 warning, even when using the decorator.
numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_def_line_with_decorators[numpydoc.tests.test_validate.DecoratorClass.test_property-1560] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_def_line_with_decorators[numpydoc.tests.test_validate.DecoratorClass.test_cached_property-1565] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_name_with_properties[numpydoc.tests.test_validate.DecoratorClass.test_property-/root/data/temp_dir/tmpt4x57kud/numpy__numpydoc__0.0/numpydoc/tests/test_validate.py] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_name_with_properties[numpydoc.tests.test_validate.DecoratorClass.test_cached_property-/root/data/temp_dir/tmpt4x57kud/numpy__numpydoc__0.0/numpydoc/tests/test_validate.py]
numpydoc/tests/test_validate.py::test_validate.BadExamples.indentation_is_not_a_multiple_of_four numpydoc/tests/test_validate.py::test_validate.BadExamples.missing_whitespace_after_comma numpydoc/tests/test_validate.py::test_validate.BadExamples.missing_whitespace_around_arithmetic_operator numpydoc/tests/test_validate.py::test_validate.BadGenericDocStrings.sections_in_wrong_order numpydoc/tests/test_validate.py::test_validate.GoodDocStrings numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.contains numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.empty_returns numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.good_imports numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.head numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.head1 numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.mode numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.multiple_variables_on_one_line numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.no_returns numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.other_parameters numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.parameter_with_wrong_types_as_substrings numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.parameters_with_trailing_underscores numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.plot numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.random_letters numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.sample numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.sample_values numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.summary_starts_with_number numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.swap numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.valid_options_in_parameter_description_sets numpydoc/tests/test_validate.py::test_validate.GoodDocStrings.warnings numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks0-expected0] numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks1-expected1] numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks2-expected2] numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks3-expected3] numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks4-expected4] numpydoc/tests/test_validate.py::test_utils_get_validation_checks[checks5-expected5] numpydoc/tests/test_validate.py::test_get_validation_checks_validity[checks0] numpydoc/tests/test_validate.py::test_get_validation_checks_validity[checks1] numpydoc/tests/test_validate.py::test_get_validation_checks_validity[checks2] numpydoc/tests/test_validate.py::test_get_validation_checks_validity[checks3] numpydoc/tests/test_validate.py::test_no_file numpydoc/tests/test_validate.py::test_extract_ignore_validation_comments[class numpydoc/tests/test_validate.py::TestValidator::test_one_liner numpydoc/tests/test_validate.py::TestValidator::test_good_class numpydoc/tests/test_validate.py::TestValidator::test_good_functions[plot] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[swap] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[sample] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[random_letters] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[sample_values] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[head] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[head1] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[summary_starts_with_number] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[contains] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[mode] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[good_imports] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[no_returns] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[empty_returns] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[multiple_variables_on_one_line] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[other_parameters] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[warnings] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[valid_options_in_parameter_description_sets] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[parameters_with_trailing_underscores] numpydoc/tests/test_validate.py::TestValidator::test_good_functions[parameter_with_wrong_types_as_substrings] numpydoc/tests/test_validate.py::TestValidator::test_bad_class numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[func] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[astype] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[astype1] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[astype2] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[astype3] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[plot] numpydoc/tests/test_validate.py::TestValidator::test_bad_generic_functions[directives_without_two_colons] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-unknown_section-msgs0] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-sections_in_wrong_order-msgs1] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-deprecation_in_wrong_order-msgs2] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-directives_without_two_colons-msgs3] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSeeAlso-no_desc-msgs4] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSeeAlso-desc_no_period-msgs5] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSeeAlso-desc_first_letter_lowercase-msgs6] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-no_summary-msgs7] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-heading_whitespaces-msgs8] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-wrong_line-msgs9] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-no_punctuation-msgs10] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-no_capitalization-msgs11] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-no_capitalization-msgs12] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-multi_line-msgs13] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadSummaries-two_paragraph_multi_line-msgs14] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-no_type-msgs15] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-type_with_period-msgs16] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-no_description-msgs17] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-missing_params-msgs18] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-bad_colon_spacing-msgs19] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-no_description_period-msgs20] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-no_description_period_with_directive-msgs21] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-parameter_capitalization-msgs22] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-integer_parameter-msgs23] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-string_parameter-msgs24] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-boolean_parameter-msgs25] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-list_incorrect_parameter_type-msgs26] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-list_incorrect_parameter_type-msgs27] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-list_incorrect_parameter_type-msgs28] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadParameters-bad_parameter_spacing-msgs29] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-return_not_documented-msgs31] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-yield_not_documented-msgs32] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-no_description-msgs34] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-no_punctuation-msgs35] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-named_single_return-msgs36] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-no_capitalization-msgs37] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadReturns-no_period_multi-msgs38] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-method_wo_docstrings-msgs39] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-two_linebreaks_between_sections-msgs40] numpydoc/tests/test_validate.py::TestValidator::test_bad_docstrings[BadGenericDocStrings-linebreak_at_end_of_docstring-msgs41] numpydoc/tests/test_validate.py::TestValidatorClass::test_raises_for_invalid_module_name[unknown_mod] numpydoc/tests/test_validate.py::TestValidatorClass::test_raises_for_invalid_module_name[unknown_mod.MyClass] numpydoc/tests/test_validate.py::TestValidatorClass::test_raises_for_invalid_attribute_name[datetime.BadClassName] numpydoc/tests/test_validate.py::TestValidatorClass::test_raises_for_invalid_attribute_name[datetime.bad_method_name] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_def_line_with_decorators[numpydoc.tests.test_validate.DecoratorClass-1541] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_def_line_with_decorators[numpydoc.tests.test_validate.DecoratorClass.test_no_decorator-1555] numpydoc/tests/test_validate.py::TestValidatorClass::test_source_file_def_line_with_decorators[numpydoc.tests.test_validate.DecoratorClass.test_three_decorators-1572]