2017-09-26 98 views
1

我在使用更广泛的python脚本中的运算符方法时遇到问题。为了缩小这个问题,我创建了下面的示例代码。尝试在Python中使用运算符方法时出现类型错误

class Car: 
    def __init__(self, Name, Speed): 
     self.Name = Name 
     self.Speed = Speed 
     self.PrintText() 

    def PrintText(self): 
     print("My %s runs %s km/h." % (self.Name, self.Speed)) 

    def GetName(self): 
     return self.Name 

    def GetSpeed(self): 
     return self.Speed 

    def __sub__(self, other): 
     try: # Try with assumption that we have to deal with an instance of AnotherClass 
     a = self.GetSpeed() 
     except: # If it doesn't work let's assume we have to deal with a float 
     a = self 

     try: # Try with assumption that we have to deal with an instance of AnotherClass 
     b = other.GetSpeed() 
     except: # If it doesn't work let's assume we have to deal with a float 
     b = other 

     return a - b 

Car1 = Car("VW", 200.0) 
Car2 = Car("Trabant", 120.0) 
print("") 

Difference = Car1 - Car2 
print("The speed difference is %g km/h." % Difference) 
print("") 

Difference = Car2 - 6.0 
print("My %s is %g km/h faster than a pedestrian." % (Car2.GetName(), Difference)) 
print("") 

Difference = 250.0 - Car1 
print("I wish I had a car that is %g km/h faster than the %s." % (Difference, Car1.GetName())) 

输出为:

My VW runs 200.0 km/h. 
My Trabant runs 120.0 km/h. 

The speed difference is 80 km/h. 

My Trabant is 114 km/h faster than a pedestrian. 

Traceback (most recent call last): 
    File "test.py", line 41, in <module> 
    Difference = 250.0 - Car1 
TypeError: unsupported operand type(s) for -: 'float' and 'instance' 

我怎么能解决时出现的第一个对象是一个浮动的问题?

+0

你需要'__rsub__' –

+0

下面的答案是正确的。我只是想提供建议。您可以使用'__str__'方法代替PrintText函数。然后你可以像这样输入:'print(Car)' – Nuchimik

回答

1

您需要定义与反向操作数减法(本身是固定//你的问题的代码,但可能需要更多的清洗):

def __rsub__(self, other): 
     a = self.GetSpeed() 

     try: # Try with assumption that we have to deal with an instance of AnotherClass 
     b = other.GetSpeed() 
     except AttributeError: # If it doesn't work let's assume we have to deal with a float 
     b = other 

     return b - a 

现在你的输出:

My VW runs 200.0 km/h. 
My Trabant runs 120.0 km/h. 

The speed difference is 80 km/h. 

My Trabant is 114 km/h faster than a pedestrian. 

I wish I had a car that is 50 km/h faster than the VW. 
1

不是真的你的具体问题的答案,但它会减少实际速度速度,而不是汽车速度。 只要做car1.Speed() - car2.Speed()car2.Speed() - 6.0。否则,你创建自己的问题。

作为一个方面说明我也建议你遵循Python的风格指南https://www.python.org/dev/peps/pep-0008/

相关问题