Отличный вопрос. Я также решил эту проблему, и хотя я согласен с тем, что «фабрики» (конструкторы методов класса) являются хорошим методом, я хотел бы предложить другой, который я также нашел очень полезным:
Вот пример (это read
метод, а не конструктор, но идея та же):
def read(self, str=None, filename=None, addr=0):
""" Read binary data and return a store object. The data
store is also saved in the interal 'data' attribute.
The data can either be taken from a string (str
argument) or a file (provide a filename, which will
be read in binary mode). If both are provided, the str
will be used. If neither is provided, an ArgumentError
is raised.
"""
if str is None:
if filename is None:
raise ArgumentError('Please supply a string or a filename')
file = open(filename, 'rb')
str = file.read()
file.close()
...
... # rest of code
Ключевая идея здесь заключается в использовании превосходной поддержки Python для именованных аргументов для реализации этого. Теперь, если я хочу прочитать данные из файла, я говорю:
obj.read(filename="blob.txt")
И чтобы прочитать это из строки, я говорю:
obj.read(str="\x34\x55")
Таким образом, у пользователя есть только один метод для вызова. Работа с ним внутри, как вы видели, не слишком сложна