为什么baseclass对象不能访问子类的方法?

时间:2014-04-02 18:33:37

标签: python oop python-2.7

是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()

2 个答案:

答案 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)