Форум сайта python.su
Прошу совета, как лучше сделать:
требуется создать объект, состоящий из нескольких полей:
а) w - список чисел
б) f - некоторая функция (например, синус)
…
Хитрость в том, что объект может быть инициализирован несколькими разными способами:
1) В конструктор передается функция f и число - длина списка, в результате генерируется объект, у которого список w заполнен нулями. Это я мог бы реализовать как-то так:
class A(object):
__init__(self, n, f):
self.f = f
self.w = [0.0]*n
...
class A(object):
__init__(self, w, f):
self.f = f
self.w = w
...
class A(object):
__init__(self, s):
data = eval(s)
self.f = data['f']
self.w = data['w']
...
a1 = A(10,cos())
a2 = A([1,1,2,0],sin())
a3 = A("{'f': cos(), 'w': [0,0,1]}")
Офлайн
А если просто типы проверять, и действовать уже согласно ситуации? Или я чего то недопонял…
P.S. вот, пару способов проверить тип переменной, если затруднения в этом…
Отредактировано (Авг. 17, 2009 21:22:28)
Офлайн
Спасибо за совет и ссылку. Но, собственно, исходный вопрос у меня был немного шире (каюсь, нечетко его сформулировал).
Я хотел узнать, есть ли какие-нибудь стандартные приемы, используемые в подобных ситуациях, ведь наверное, я не единственный, кто столкнулся с такой необходимостью? Один вариант подсказали - проверить типы входных параметров, есть ли еще какие-нибудь способы?
PS Ваше предложение анализировать тип данных - вполне может быть решением, смущает лишь то, что придется проанализировать несколько совокупностей входных данных и для каждой - своя ветка в конструкторе. Боюсь, что конструктор разрастется до нечитаемости (реальная зачача немного сложнее, чем та, что я здесь привел).
Офлайн
могу предложить вот такой метод с определением типов, как ты и хотел, 3 “конструктора”, все читаемо
class A(object):
def __init__(self, a, b=None):
if type(a).__name__ == 'int':
self._init1(a, b)
elif type(a).__name__ == 'list':
self._init2(a, b)
elif type(a).__name__ == 'str':
self._init3(a)
def _init1(self, n, f):
print "первый конструктор делает свои дела"
def _init2(self, w, f):
print "второй конструктор делает свои дела"
def _init3(self, s):
print "третий конструктор делает свои дела"
a1 = A(123, hex(0))
a2 = A([1, 2, 3], hex(0))
a3 = A("{'f': cos(), 'w': [0,0,1]}")
Отредактировано (Авг. 17, 2009 23:41:28)
Офлайн
Офлайн
pasaranaxАха, спасибо большое, так действительно гораздо более наглядно
могу предложить вот такой метод с определением типов, как ты и хотел, 3 “конструктора”, все читаемо
pasaranaxТочно. Спасибо за подсказку, я бы на этом еще споткнулся.
И на счет передачи функции, тебе надо результат работы функции передать или саму функцию как объект? А то в этои случае передается результат.
skyОго, похоже, это гораздо более мощная штуковина, и гораздо более сложная :) Во всяком случае, мне еще рано такой пользоваться - я там понял хорошо, если половину… вернусь к ней попозже, когда наберусь опыта побольше
Реализация перегрузки функций
Офлайн
Можно еще тупо поименовать аргументы
class A(object):
def __init__(self,s=None,n=None,w=None,f=None):
if s!=None:#если передан s
...
elif n!=None:#если n
...
...#и так далее
a1 = A(w=10,f=cos())
a2 = A(n=[1,1,2,0],f=sin())
a3 = A(s="{'f': cos(), 'w': [0,0,1]}")
Отредактировано (Авг. 20, 2009 11:38:44)
Офлайн
QZipстранно, у меня с именованными аргументами не получалось, я подумал, что в конструкторе они не канают
Можно еще тупо поименовать аргументыclass A(object):
def __init__(self,s=None,n=None,w=None,f=None):
if s!=None:#если передан s
...
elif n!=None:#если n
...
...#и так далее
a1 = A(w=10,f=cos())
a2 = A(n=[1,1,2,0],f=sin())
a3 = A(s="{'f': cos(), 'w': [0,0,1]}")
Офлайн
Действительно, странно.
Python 2.6.2, если что.
Офлайн