这有什么区别:
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__
没有提供任何效果。
答案 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