Как правильно организовать методы класса и методы экземпляра
Только начал вникать в саму концепцию ООП. Туплю на понятийном уровне: Понимаю, что есть методы, имеющие смысл применительно к конкретному экземпляру класса (методы экземпляра) и методы "отстраненные", внешние: им "без разницы", каким экземпляром оперировать (по видимому, это методы класса).
Что делать, если эти методы желательно и назвать синонимично, и делать они должны (почти или точно) одно и то же, разница должна быть лишь в способе вызова.
Как бы вы организовали следующий класс:
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 шт):
Не нужен второй метод 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