3

我有以下示例设置:

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 Class 类型并为其分配 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 个,但它不接受该类的初始化参数?

我真的不清楚为什么我可以在距离类中分配“自我”,并且在它返回之前它似乎有正确的初始化但在返回时它不能正常工作。

4

4 回答 4

5

问题是你从 2 个类 Feet 和 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

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

于 2013-09-24T14:21:38.403 回答
2

这里绝对没有理由从 Feet 或 Meters 继承,更不用说两者了。这是组合的经典案例,而不是继承,特别是因为您将单元类作为参数传递。删除那个子类,__init__你可以做self.type = type.

于 2013-09-24T14:26:25.463 回答
1

其他答案涵盖了您在继承方面遇到的问题,但没有涵盖您对self.

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

在这种情况下,当__init__返回时selfname 超出范围,但原始实例被分配给dist就好像您没有重新绑定 name 一样self

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

于 2013-09-24T14:32:26.557 回答
0

这一行:

self = type

不做你认为它做的事。您认为这是一个赋值语句,其中 by 引用的对象self具有 的属性type,如 C++。

Python 没有与其他语言相同的赋值。

该行所做的是将本地名称绑定selftype当前绑定的对象。它在 之外绝对没有影响,对之前绑定Distance.__init__()的对象几乎没有影响。self

于 2013-09-24T14:34:32.257 回答