Python类继承初始化

时间:2013-09-24 14:06:02

标签: python class python-2.7 initialization multiple-inheritance

我有以下示例设置:

class Feet:
   def __init__ (self, value = 0.0):
      self.value = value
      self.units = "f"

   def feet(self):
      return  self.value


class Meters:
   def __init__(self, value = 0.0):
      self.value = value
      self.units = "m"

   def feet(self):
      # This is probably not an accurate conversion.
      return  self.value * 2.54 * 10 


class Distance (Feet, Meters):
   def __init__(self, type = Feet()):
      Feet.__init__(self)
      Meters.__init__(self)
      print type.feet()   -- Prints 254.0
      self = type
      print self.feet()   -- Prints 254.0

dist = Distance(Meters(10.0))

print dist.units   -- Prints = "m"
print dist.value   -- Prints = 0.0
print dist.feet()  -- Prints = 0.0

我似乎无法理解为什么当我将类初始化为Meters类类型并将其指定为10.0时,我不保留10.0。然而,单位似乎保持正确。我错过了一些关于如何设置的内容吗?

我的理解是我正在创建Meters的“实例”,并将其分配给Distance的“self”变量。如果自我值无法修改,我可以理解我的单位是否为“f”,但我的单位是“m”所以它显然将Meters类分配给自己,但它没有采用实例化的值,我觉得很奇怪

说实话我甚至不知道在这种情况下我会谷歌是什么,所以我道歉我没有做过大量的谷歌搜索,我发现的大多数根本不适用于这类问题

此外,我的计划是基本上将它“转换”为相同的类型,无论你传入什么,例如脚我会返回Feet类的自我实例,而在Meters类中我将返回Feet( self.Value * 2.54 * 10)所以我总是在Feet中保持距离。

所以脚的脚变得

def feet(self):
   return self

米的脚变为

def feet(self):
  return Feet(self.value * 2.54 * 10)

回顾一下,有没有理由我能够在初始化过程中传入2个类中的1个,但它不会为该类接受我的初始化参数?

我真的不清楚为什么我可以在距离类中指定“self”,在它返回之前出现以进行正确的初始化但是在返回时它不能正常工作。

4 个答案:

答案 0 :(得分:5)

问题在于你继承了2类Feet and Meters。两个类都有相同的方法。在Distance.__init__()方法中,在执行此操作时,您将使用Meters的方法覆盖Feet的方法:

  Feet.__init__(self)
  Meters.__init__(self)

我会做的不同:

class Distance(object):
    def __init__(self, meters=None, feet=None):
        self.feet = feet
        self.meters = meters

然后你可以做类似的事情:

distance = Distance(meters=Meters(12))
print distance.meters.value
print distance.meters.type
# Here do whatever you want with them

您可以同时传入这两个对象。并做一些其他的东西 两个对象如果两者都不同于无。

答案 1 :(得分:2)

绝对没有理由在这里继承英尺或米,更不用说两者兼而有之了。这是组合的经典案例,而不是继承,尤其是因为您将单元类作为参数传递。删除该子类,并在__init__中执行self.type = type

答案 2 :(得分:1)

其他答案涵盖了您继承的问题,但未涵盖self的重新绑定。

在方法(例如__init__)内,self只是绑定到实例的本地名称。你可以完全自由地重新命名,但这只是让self引用其他东西。 它不会影响实例

在这种情况下,当__init__返回时,self名称超出范围,但原始实例被分配给dist,就好像您没有反弹名称{{ 1}}。

请注意self是初始值设定项,而不是构造函数。 Python还允许您为类(__init__)定义自定义构造函数,构造函数可以更改返回的对象。但是你不需要在这里使用它。

答案 3 :(得分:0)

这一行:

self = type

不符合您的想法。您认为这是一个赋值语句,其中self引用的对象具有type的属性,即la C ++。

Python没有与其他语言具有相同意义的作业。

该行的作用是将本地名称self绑定到type当前绑定的对象。它在Distance.__init__()之外完全没有效果,对self之前绑定的对象几乎没有任何影响。