Python类继承初始化

2024-05-23 14:36:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下设置示例:

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。然而,这些单位似乎一直是正确的。我是不是遗漏了一些关于这是怎么设置的?

我的理解是,我正在创建一个米的“实例”,并将其分配给距离的“自”变量。如果不能修改self值,我可以理解我的单位是“f”,但是我的单位是“m”,所以很明显它把Meters类分配给self,但是它没有采用实例化的值,我觉得很奇怪。

老实说,我甚至不知道在这种情况下我会用谷歌搜索什么,所以我很抱歉我没有做过很多的谷歌搜索,我发现大部分的搜索结果根本不适用于这类问题。

此外,我的计划是基本上“投射”到同一类型,不管你传入什么,例如,对于feet,我将返回feet类的self实例,而在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个,但它不接受该类的初始化参数吗?

我真的不明白为什么我可以在distance类中分配“self”,在它返回之前似乎有正确的初始化,但在返回时它不起作用。


Tags: selfreturninitvaluedistdeftype单位
3条回答

问题是,你是从两个类英尺和米继承的。两个类都有相同的方法。在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

您可以同时传入这两个对象。做一些其他的事情 如果这两个对象都不同于“无”。

在这里,无论是脚还是米,绝对没有继承的理由,更不用说两者都继承了。这是组合的典型情况,而不是继承,特别是因为您将units类作为参数传递。删除该子类,然后在__init__中可以执行self.type = type

其他的答案涵盖了继承的问题,但还没有涵盖重新绑定self

在方法(例如__init__)中,self只是绑定到实例的本地名称。您完全可以重新绑定名称,但这只会使self引用其他内容。它不会影响实例

在本例中,当__init__返回self名称超出范围时,原始实例被分配给dist,就好像您没有重新绑定名称self

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

相关问题 更多 >