哪种继承更好?

时间:2017-06-30 05:38:27

标签: python inheritance

这有什么区别:

class Vehicle():
    def __init__(self,  x, y):
        self.y = y
        self.x = x

class Car(Vehicle):
    def __init__(self, x, y):
        Vehicle.__init__(self, x, y)

class Scooter(Vehicle):
    def __init__(self, x, y):
         Vehicle.__init__(self,  x, y)

和此:

class Vehicle():
    def __init__(self,  x, y):
         self.y = y
         self.x = x

class Car(Vehicle):
         pass            

class Scooter(Vehicle):
         pass

因为在子类中没有def __init__我得到了相同的东西,我的意思是__init__没有提供任何效果。

5 个答案:

答案 0 :(得分:1)

你不应该做其中任何一个。最好的方法是使用super

class Vehicle():
    def __init__(self,  x, y):
        self.y = y
        self.x = x

class Car(Vehicle):
    def __init__(self, x, y):
        super(Car, self).__init__(x, y)
        # super().__init__(x, y) # for python3

查看Raymond Hettinger(核心python撰稿人)的this博客文章,了解您应该使用super的原因

答案 1 :(得分:0)

当您想要进行特定于孩子的初始化时,您需要__init__方法。假设您的子类需要将另一个参数传递给构造函数,并且该类对于该类是唯一的,在这种情况下,实际上需要__init__方法。

class Vehicle():
    def __init__(self,  x, y):
        self.y = y
        self.x = x

class Car(Vehicle):
    def __init__(self, x, y, z):
        Vehicle.__init__(self, x, y)
        self.z = z

class Scooter(Vehicle):
    def __init__(self, x, y, z):
         Vehicle.__init__(self,  x, y)
         self.z = z

答案 2 :(得分:0)

如果您未在子类中提供__init__方法,则只使用其父类(即继承)中定义的__init__方法。在前一种情况下,您将覆盖子类的__init__方法,但您只是调用父类的__init__方法。所以,如果你不这样做(就像后面的情况那样),那就是一样的。后一种情况自动继承 __init__方法。

编写相同内容的其他方法是:

class Car(Vehicle): #This is the best way to do it though
   def __init__(self, x, y):
      super()__init__(x, y)

或者

class Car(Vehicle):
   def __init__(self, x, y):
      self.x = x
      self.y = y

TLDR;它们是等价的。

答案 3 :(得分:0)

我认为最好用一个例子来解释。

现在采取这种情况:

NSString *encodedString =@"?UTF-8?Q?=C2=A0New_skills";
NSData *decodedData = [[NSData alloc] initWithBase64EncodedString: encodedString options:0];
NSString *decodedString = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding];
NSLog(@"%@", decodedString);

        NSLog(@"Decoded String: %@",decodedString);

然而他们赢得的共同点是什么?

>Vehicle  ---> Car,Bike,Boat,Aeroplane,Train

>[All are vehicles right]

>Things they have in common would be (say for ex.) **Price** and **Color**

但你明白了吗?所以,当我想要一个车辆对象时我不想要(或者我不能说出轮子的数量)在这种情况下,我可以仅使用价格和颜色

初始化

但是当我知道车辆的具体类型汽车时,现在我可以>**Wheels**. The total number of wheels may differ. > > Car-4 Bike-2 Boat-0 Aeroplane-(**Not sure**) Train-(**Many I guess**?) 车轮数量。现在,这是对象特定初始化发挥主要作用的地方。

以上示例的完整示例代码:

__init__

输出:

class Vehicle():
    def __init__(self,  x, y):
        self.color = y
        self.price = x
    def Horn(self):
        print("Pommm...Pommmmm!!")

class Car(Vehicle):
    def __init__(self, x, y,wheel):
        Vehicle.__init__(self, x, y)
        self.wheel = "Four Wheels man: 4"

class Scooter(Vehicle):
    def __init__(self, x, y,wheel):
         Vehicle.__init__(self,  x, y)
         self.wheel = "Just Two man : 2"



VehObj = Vehicle("5000$","Black")
VehObj.Horn()
print(VehObj.color,VehObj.price)

#However note this

carObj = Car("5000$","Black",4)
print(carObj.color,carObj.price,carObj.wheel)

#Look at this

sObj = Scooter("5000$","Black",2)
print(sObj.color,sObj.price,sObj.wheel)

希望能帮助你。

答案 4 :(得分:-1)

如果您不想编辑超类的__init__方法,则调用超类的init方法是可选的。

但是如果你想编辑超类方法,你需要自定义init

class Vehicle():
    def __init__(self,  x, y):
        self.y = y
        self.x = x


class Car(Vehicle):
    def __init__(self, x, y, z):
        Vehicle.__init__(self, x, y)
        self.z = z