我有以下设置示例:
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”,在它返回之前似乎有正确的初始化,但在返回时它不起作用。
问题是,你是从两个类英尺和米继承的。两个类都有相同的方法。在
Distance.__init__()
方法中,执行此操作时将使用Meters方法重写Feet的方法:我会做些不同的事情:
然后你可以做如下事情:
您可以同时传入这两个对象。做一些其他的事情 如果这两个对象都不同于“无”。
在这里,无论是脚还是米,绝对没有继承的理由,更不用说两者都继承了。这是组合的典型情况,而不是继承,特别是因为您将units类作为参数传递。删除该子类,然后在
__init__
中可以执行self.type = type
。其他的答案涵盖了继承的问题,但还没有涵盖重新绑定
self
。在方法(例如
__init__
)中,self
只是绑定到实例的本地名称。您完全可以重新绑定名称,但这只会使self
引用其他内容。它不会影响实例。在本例中,当
__init__
返回self
名称超出范围时,原始实例被分配给dist
,就好像您没有重新绑定名称self
。注意
__init__
是一个初始值设定项,而不是构造函数。Python还允许您为类(__new__
)定义自定义构造函数,并且构造函数可以更改返回的对象。但是你不需要在这里使用它。相关问题 更多 >
编程相关推荐