【问题标题】:How do I make it possible to subtract and multiply in both directions in a class method如何在类方法中实现双向减法和乘法
【发布时间】:2015-04-28 23:05:28
【问题描述】:

所以我正在尝试做一个可以加、减和乘体积的程序(由大小和单位组成)我让__add__ 工作,但__rsub____mult__ 我还没有弄清楚如何让他们工作。我希望能够进行Volume * 22 * Volume 之类的操作。任何关于如何去做的建议将不胜感激!

def __add__ (self, v2): #adds to magnitude using an int or another volume
    if Volume.is_valid(self):
        if isinstance(v2, Volume):
            if Volume.is_valid(v2): #check if V2 is valid
                if self.__units == v2.__units:
                    return Volume(self.__magnitude + v2.__magnitude, 
                                  self.__units)
                else:
                    if v2.__units == 'ml':
                        v3 = v2.customary()
                        return Volume(self.__magnitude + v3.__magnitude, 
                                      self.__units)
                    elif v2.__units == 'oz':
                        v3 = v2.__units
                        return Volume(self.__magnitude + v3.__magnitude, 
                                      self.__units)

        elif isinstance(v2,(int,float)):
            #create new Volume with same units as self
            v3 = Volume(v2, self.__units)
            return Volume(self.__magnitude + v3.__magnitude, self.__units)

def __radd__ (self, v2): #adds ability to do i.e. 2 + a
    return self.__add__(v2)

def __sub__ (self, v2): #same as __add__ but this subtracts
    if Volume.is_valid(self):
        if isinstance(v2, Volume):
            if Volume.is_valid(v2):
                if self.__units == v2.__units:
                    return Volume(self.__magnitude - v2.__magnitude, 
                                  self.__units)
                else:
                    if v2.__units == 'ml':
                        v3 = v2.customary()
                        return Volume(self.__magnitude - v3.__magnitude, 
                                      self.__units)
                    elif v2.__units == 'oz':
                        v3 = v2.__units
                        return Volume(self.__magnitude - v3.__magnitude, 
                                      self.__units)
        elif isinstance(v2,(int,float)):
            v3 = Volume(v2, self.__units)
            return Volume(self.__magnitude - v3.__magnitude, self.__units)

def __rsub__ (self, v2):
    return Volume(v2.__magnitude - self.__magnitude, self.__units)

def __mult__ (self, v2):#multiplies a volume by an int only (not other vol)
    if Volume.is_valid(self):
        if isinstance(v2, Volume):
            if Volume.is_valid(v2):
                if self.__units == v2.__units:
                    return Volume(self.__magnitude * v2.__magnitude, 
                                  self.__units)
                else:
                    if v2.__units == 'ml':
                        v3 = v2.customary()
                        return Volume(self.__magnitude * v3.__magnitude, 
                                      self.__units)
                    elif v2.__units == 'oz':
                        v3 = v2.__units
                        return Volume(self.__magnitude * v3.__magnitude, 
                                      self.__units)
        elif isinstance(v2,(int,float)):
            v3 = Volume(v2, self.__units)
            return Volume(self.__magnitude * v3.__magnitude, self.__units)
        #return Volume(self.__magnitude * v2, self.__units)

def __rmult__ (self, v2):
    return self.__mult__(v2)

【问题讨论】:

  • def init (self, m = 0, u = "ml"): self.__magnitude = m self.__units = u

标签: class python-3.x methods


【解决方案1】:

乘法的神奇方法是__mul__,而不是__mult__

__rsub__ 的工作量似乎不如__sub__。可能是这样的:

def __rsub__(self, v2):
    return Volume(v2) - self

会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多