如何有效地增加类的属性?[Python 3]

2cmtqfgy  于 2022-12-01  发布在  Python
关注(0)|答案(3)|浏览(126)

例如,假设我有以下代码:

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

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

如果我想创建一个abcde的示例,比如zw,这样它的属性值就等于示例zwt的对应属性的乘积,我只需执行以下操作:

zw = abcde(50, 18)

但是我的实际代码有abcde的20个属性,我需要一个通用的方法来把这些属性相乘,因为如果我有20个类,每个类有20个属性,那就有400个数字要写出来,然后包括混合(有很多),我将永远在那里。我希望它是这样的:

zw = abcde(z)*abcde(w)

请让我知道我是否有办法做到这一点。

hjqgdpho

hjqgdpho1#

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)
lo8azlld

lo8azlld2#

您可以这样尝试:

>>> 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]
yqkkidmi

yqkkidmi3#

如果要计算所有参数(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个类zwx你可以把前面代码的结果传递给你的最终类:

>>> zwx(42, 24, 60)

相关问题