Python类继承初始化

ona*_*000 3 python initialization class multiple-inheritance python-2.7

我有以下示例设置:

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
Run Code Online (Sandbox Code Playgroud)

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

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

说实话我甚至不知道在这种情况下我会谷歌,所以我道歉我没有做过很多谷歌搜索,我发现的大部分内容根本不适用于这类问题.

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

所以脚脚变成了

def feet(self):
   return self
Run Code Online (Sandbox Code Playgroud)

因为米脚变成了

def feet(self):
  return Feet(self.value * 2.54 * 10)
Run Code Online (Sandbox Code Playgroud)

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

我真的不清楚为什么我可以在距离类中指定"自我",在它返回之前它似乎有正确的初始化但在返回时它不能正常工作.

Pac*_*aco 5

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

  Feet.__init__(self)
  Meters.__init__(self)
Run Code Online (Sandbox Code Playgroud)

我会做的不同:

class Distance(object):
    def __init__(self, meters=None, feet=None):
        self.feet = feet
        self.meters = meters
Run Code Online (Sandbox Code Playgroud)

然后你可以这样做:

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

您可以同时传入这两个对象.如果两个对象都是None,那么用两个对象做一些其他的东西.