Существует несколько способов изменить поведение метода в Python в зависимости от типа данных, передаваемых в него. Вот основные подходы:
if/elif/else): Это самый простой и очевидный способ. Внутри метода можно проверить тип аргумента с помощью функции type() или isinstance() и выполнить различный код в зависимости от результата.
      def my_method(data):
  if isinstance(data, int):
    # Обработка для целых чисел
    print("Received an integer:", data * 2)
  elif isinstance(data, str):
    # Обработка для строк
    print("Received a string:", data.upper())
  else:
    # Обработка для других типов данных
    print("Unsupported data type")
default arguments) и проверку типов внутри метода, как описано в первом пункте.
          def my_method(data=None):
  if data is None:
    print("No data provided")
  elif isinstance(data, int):
    print("Integer:", data)
  elif isinstance(data, str):
    print("String:", data)
  else:
    print("Unknown type")
functools.singledispatch, для автоматической диспетчеризации на основе типа первого аргумента.  Это позволяет более элегантно разделять логику обработки разных типов.
      from functools import singledispatch
@singledispatch
def my_method(arg):
  print("Generic implementation for:", type(arg))
@my_method.register(int)
def _(arg):
  print("Integer implementation:", arg * 3)
@my_method.register(str)
def _(arg):
  print("String implementation:", arg.lower())
my_method(10)  # Output: Integer implementation: 30
my_method("HELLO") # Output: String implementation: hello
my_method(1.5) # Output: Generic implementation for: <class 'float'>
AttributeError, которое можно обработать. Этот подход поощряет гибкость и переиспользование кода.
      def process_data(data):
  try:
    result = data.method_x()  # Предполагаем, что у объекта есть метод method_x
    print("Result:", result)
  except AttributeError:
    print("Object does not have method_x")
class ClassA:
  def method_x(self):
    return "ClassA's method_x"
class ClassB:
  def method_x(self):
    return 123
process_data(ClassA()) # Output: Result: ClassA's method_x
process_data(ClassB()) # Output: Result: 123
process_data(10)       # Output: Object does not have method_x
class IntProcessor:
    def process(self, data):
        return data * 2
class StringProcessor:
    def process(self, data):
        return data.upper()
def get_processor(data):
    if isinstance(data, int):
        return IntProcessor()
    elif isinstance(data, str):
        return StringProcessor()
    else:
        raise ValueError("Unsupported data type")
processor = get_processor(10)
print(processor.process(10))  # Output: 20
processor = get_processor("hello")
print(processor.process("hello")) # Output: HELLO
Выбор подходящего способа зависит от конкретной задачи, сложности логики обработки и желаемой гибкости кода. singledispatch обычно предпочтительнее для более сложных случаев, когда необходимо четко разделить логику обработки разных типов, а условные операторы хорошо подходят для простых случаев. Duck typing является мощным способом, если можно полагаться на наличие определённых методов у объектов.