是OOP的新手
下面的代码包含超类(学校)及其在子类(教师)中继承的属性。我为基类创建了一个对象
a = schools('jack','m2',2)
。它创建一个实例并初始化实例变量,但是当我尝试访问子类方法时使用此对象时,它会失败,并显示以下错误:
AttributeError:学校实例没有属性'show'。
class schools:
def __init__(self,name,sex,rank):
self.name = name
self.sex = sex
def saying(self):
print self.name
class teachers(schools):
def show(self):
print self.sex
a = schools('jack','m2',2)
a.saying()
a.show()
答案 0 :(得分:1)
子类(或子类或后代)构建在基类(超类或祖先)之上。因此,子类可以执行超类可以执行的任何操作, plus 它自己添加的内容。
但它并没有改变超类。超类只能执行超类(以及超类的祖先)中定义的内容。
所以,学校可以说() 教师可以说(),和 show()。
学校不知道其中一个子类已经定义了show()。
答案 1 :(得分:1)
子类可以通过继承访问父(基类)类。父母并不知道它有孩子或他们的财产是什么。
class Schools:
def __init__(self,name,sex,rank):
self.name = name
self.sex = sex
def saying(self):
print self.name
# end class Schools
class Teachers(schools):
def show(self):
print self.sex
# Teachers has and can use the methods and properties below because it is inherited
# def __init__(self,name,sex,rank):
# self.name = name
# self.sex = sex
#
# def saying(self):
# print self.name
# end class Teachers
if __name__ == "__main__":
teacher = Teachers('jack','m2',2)
teacher.saying()
teacher.show()
这对于开发人员构建其他人所做的事情非常有用。典型的例子是车辆。下面显示了继承中使用的一些不同的东西。 Tractor,Car和Van都继承了Vehicle,因此他们拥有Vehicle的属性。拖拉机,汽车和范是兄弟姐妹,但他们对彼此一无所知。他们有不同的方法,将用于不同的事情。但是,它们都有一些共同的因素,所以我们从车辆继承了这些共同因素。 SportsCar拥有车辆的属性和方法,并且具有Car的属性和方法。
class Vehicle(object):
def __init__(self, name):
super().__init__()
self.name = name
self.x = 0
self.y = 0
# end Constructor
def drive(self, x, y):
"""Drive the car to the given x,y point."""
self.x = x
self.y = y
# end drive
# end Vehicle
class Tractor(Vehicle):
pass
# end class Tractor
class Van(Vehicle):
def __init__(self, name, passengers=1):
super().__init__(name) # Call parent method
self.max_capacity = 5
self.passengers = passengers
# end Constructor
def drive(self, x, y):
"""We have passengers now, so we care about safety."""
if self.passengers <= self.max_capacity:
super().drive(x, y) # Use parent's (Vehicle) drive method
# end drive
# end class Van
class Car(Vehicle):
def __init__(self, name):
super().__init__(name)
self.speed = 0
# end Constructor
def setSpeed(self, speed):
self.speed = speed
def drive_fast(self, x, y, speed):
self.setSpeed(speed)
self.drive(x, y)
# end class Car
class SportsCar(Car):
pass
# end class SportsCar
所有这些代码都是Python 3.x,因此您必须更改使用super方法的方式。
super(Vehicle, self).drive(x, y)