2014-12-25 3 views
0

В качестве примера, скажем, у меня есть следующие:Как эффективно умножать атрибуты классов? [Python 3]

class abcde: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

z = abcde(5, 6) 
w = abcde(10, 3) 

Если бы я хотел, чтобы создать экземпляр abcde, скажем zw, так что значения его атрибутов были продуктом соответствующего атрибуты экземпляров z и wt, я бы просто сделать:

zw = abcde(50, 18) 

Но мой фактический код имеет 20 атрибутов для abcde и мне нужен общий способ умножения этих атрибутов вместе, потому что если у меня есть 20 гр ласты, каждая из которых имеет 20 атрибутов, это 400 фигур для записи, а затем микширование (которых много), я буду там навсегда. Я хочу, чтобы это было чем-то вроде:

zw = abcde(z)*abcde(w) 

Пожалуйста, дайте мне знать, если есть способ, которым я могу это сделать.

+0

упорядочены атрибуты? Всегда ли 'x' перед« y », раньше,' z' и т. Д.? Если это так, возможно, у вас должен быть атрибут * one *, который хранит кортеж ... Умножение двух кортежей по элементам легко: 'map (operator.mul, (5,6), (10,3))'. – unutbu

+0

Я не знаю, почему вы хотите использовать классы здесь: это не совсем то, для чего они нужны. Более простая функция была бы более подходящей. –

+1

Что вы на самом деле пытаетесь выполнить? Это звучит как потенциальная проблема XY. –

ответ

0

Если вы хотите, чтобы вычислить умножения всех аргументов (20 атрибутов) можно пихты определить функцию для вычисления умножения, а затем использовать эту функцию с zip в списке понимание:

>>> def mult(x): 
...  mul=1 
...  for i in x : 
...   mul=mul*i 
...  return mul 
... 
>>> l1=[2,3,4] 
>>> l2=[3,4,5] 
>>> l3=[7,2,3] 
>>> [mult(x) for x in zip(l1,l2,l3)] 
[42, 24, 60] 

тогда, если мы предположим, у вас есть 3 класса z, w, x вы можете передать результат предшествующего кода к конечному классу:

>>> zwx(42, 24, 60) 
4
class Abcde: 
    def __init__(self,x,y): 
     self.x=x 
     self.y=y 

    def __mul__(self, other): 
     return Abcde(self.x * other.x, self.y * other.y) 

    def __repr__(self): 
     return "Abcde({}, {})".format(self.x, self.y) 

z = Abcde(5,6) 
w = Abcde(10,3) 

zw = z * w # = Abcde(50, 18) 

или, в более общем плане:

from collections import namedtuple 

def namedvector(typename, field_names): 
    newclass = namedtuple(typename, field_names) 
    newclass.__mul__ = lambda self, other: newclass(*(a * b for a,b in zip(self, other))) 
    return newclass 

Abcde = namedvector("Abcde", ["x", "y", "z", "t", "u"]) 

z = Abcde(5, 6, 7, 8, 9) 
w = Abcde(1, 2, 3, 4, 5) 

zw = z * w 

print(zw)  # => Abcde(x=5, y=12, z=21, t=32, u=45) 
0

вы можете попробовать, как это:

>>> class abcde: 
...  def __init__(self): 
...   self.data = [] 
...  def num(self,*x): 
...   self.data.append(x) 
...  def mul(self): 
...   return [ x*y for x,y in zip(*self.data) ] 
... 
>>> initlize = abcde() 
>>> initlize.num(5,6) 
>>> initlize.num(10,3) 
>>> initlize.mul() 
[50, 18] 
Смежные вопросы