2013-09-24 206 views
3

我有以下示例设置: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 

我似乎无法理解为什么当我初始化类的米类类型,并指定10.0,我不守10.0。然而单位似乎保持正确。我是否错过了关于如何设置的内容?

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

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

此外,我的计划是基本上将它“铸造”为相同类型,无论您通过哪种方式,例如对于脚,我将返回Feet类的自实例,并且在Meters类中,我将返回Feet (self.Value * 2.54 * 10)所以我会永远有我的脚距离。

所以脚脚变得

def feet(self): 
    return self 

为米英尺变得

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

重述一遍,有没有我可以在1 2类通过在初始化过程中的理由,但它不需要我的初始化参数为该类?

我真的不清楚为什么我可以在距离类中指定“自我”,并在返回之前出现有正确的初始化,但返回后它不起作用。

+0

您正在重新定义所有方法。你的前两个类有相同的方法。您从两者继承,所以第二个类的方法覆盖第一个类的方法 – Paco

回答

5

事情是,你是从2类继承英尺和米。两个类都有相同的方法。在你Distance.__init__()方法,你在做的时候覆盖英尺与米方法的方法是:

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,那么使用 做一些其他的事情。

+0

当我删除这两种情况时,我没有“属性”单元,那么如果有意义的话,如何“初始化”类?我只是尝试键入.__ init __(self),但是当我打印“type.feet()”时,它将作为* instance和float的非端口操作数类型出现,但.value应该是一个浮点数,而不是一个实例。 – onaclov2000

+0

在这种情况下,你不应该继承2类,我会用另一个编辑我的答案 – Paco

2

这里完全没有理由从脚或米继承,更不用说这两者。这是一个经典的构图案例,而不是继承,尤其是因为您将单位类作为参数传递。删除那个子类,并在__init__你可以做self.type = type

1

其他答案涵盖了你继承的问题,但没有涵盖你重新登录self

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

在这种情况下,当__init__返回self名字超出范围,但原始实例分配给dist就好像你没有反弹的名字self

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

0

这条线:

self = type 

没有做什么,你认为它。你认为这是一个赋值语句,其中self提到的对象具有type(la C++)的属性。

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

该行的作用是将本地名称self绑定到type当前绑定的对象。它在Distance.__init__()以外绝对没有效果,并且对先前绑定的对象几乎没有影响。