Как правильно организовать методы класса и методы экземпляра

Только начал вникать в саму концепцию ООП. Туплю на понятийном уровне: Понимаю, что есть методы, имеющие смысл применительно к конкретному экземпляру класса (методы экземпляра) и методы "отстраненные", внешние: им "без разницы", каким экземпляром оперировать (по видимому, это методы класса).

Что делать, если эти методы желательно и назвать синонимично, и делать они должны (почти или точно) одно и то же, разница должна быть лишь в способе вызова.

Как бы вы организовали следующий класс:

class Person:

    isMarriedTo = None

    # метод экземпляра
    def marry(self, other):
        """Выбранный Экземпляр (сам) женится на другом экземпляре"""
        print(f'{self} married {other}')     # специфичный код
        hypotetic_common_method(self, other) # вызов общего кода

# внешний по отношению к экземплярам метод.
# здесь помещен в модуль вне класса, но хотелось бы иметь его внутри класса
def marry(pers_1, pers_2):
    """Сторонний наблюдатель фиксирует факт того, что два экземпляра поженились"""
    print(f'{pers_1} and {pers_2} got married') # специфичный код
    hypotetic_common_method(pers_1, pers_2)     # вызов общего метода

def hypotetic_common_method(pers_1, pers_2):
    pers_1.isMarriedTo = pers_2
    pers_2.isMarriedTo = pers_1

Bob = Person()
Alice = Person()

Bob.marry(Alice)
marry(Bob, Alice)

Ответы (1 шт):

Автор решения: insolor

Не нужен второй метод marry, у вас уже существующий метод может работать через вызов Person.marry(Bob, Alice). При таком вызове Bob попадет в параметр self, Alice - в параметр other.

Ну и hypotetic_common_method переносите внутрь класса как статический метод, внутри marry вызываете его через Person.hypotetic_common_method(self, other).

class Person:

    isMarriedTo = None

    def __init__(self, name):
        self.name = name

    def __str__(self):
        return self.name

    # метод экземпляра
    def marry(self, other):
        """Выбранный Экземпляр (сам) женится на другом экземпляре"""
        print(f'{self} married {other}')     # специфичный код
        Person.hypotetic_common_method(self, other) # вызов общего кода
    
    @staticmethod
    def hypotetic_common_method(pers_1, pers_2):
        pers_1.isMarriedTo = pers_2
        pers_2.isMarriedTo = pers_1


Bob = Person("Bob")
Alice = Person("Alice")

Bob.marry(Alice)
Person.marry(Bob, Alice)

Вывод:

Bob married Alice
Bob married Alice
→ Ссылка