Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么可以';t基类对象可以';t访问childclass';什么方法?_Python_Oop_Python 2.7 - Fatal编程技术网

Python 为什么可以';t基类对象可以';t访问childclass';什么方法?

Python 为什么可以';t基类对象可以';t访问childclass';什么方法?,python,oop,python-2.7,Python,Oop,Python 2.7,我是OOP的新手 下面的代码包含超级类(学校)及其在子类(教师)中继承的属性。我已经为基类创建了一个对象 a=schools('jack','m2',2)。它创建一个实例并初始化实例变量,但当使用此对象时,当我尝试访问childclass方法时,它失败,出现以下错误: AttributeError:schools实例没有属性“show” 子类(或子类或子类)构建在基类(超类或祖先)的基础上。所以子类可以做它的超类可以做的任何事情,加上它自己添加的东西 但它不会改变超类。超类只能执行超类(以及超类

我是OOP的新手 下面的代码包含超级类(学校)及其在子类(教师)中继承的属性。我已经为基类创建了一个对象
a=schools('jack','m2',2)
。它创建一个实例并初始化实例变量,但当使用此对象时,当我尝试访问childclass方法时,它失败,出现以下错误:

AttributeError:schools实例没有属性“show”

子类(或子类或子类)构建在基类(超类或祖先)的基础上。所以子类可以做它的超类可以做的任何事情,加上它自己添加的东西

但它不会改变超类。超类只能执行超类(以及超类的祖先)中定义的操作

所以,学校可以这么做 教师可以说()和表演()


学校不知道它的一个子类定义了show()。

子类可以通过继承访问父(基)类。家长不知道自己有孩子,也不知道他们的财产是什么

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()
这对于开发人员在其他人所做的事情的基础上进行构建非常有用。典型的例子是车辆。下面显示了在继承中使用的一些不同的东西。拖拉机、汽车和厢式货车都继承了车辆,因此它们具有车辆的属性。拖拉机、汽车和货车是兄弟姐妹,但他们彼此一无所知。他们有不同的方法,将用于不同的事情。然而,它们都有一些共同的因素,所以我们从车辆继承了这些共同因素。跑车有车辆的属性和方法,它也有车辆的属性和方法

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

因为基类不是扩展类。为什么您希望
教师
上的方法在
学校
上可用?如果您希望有一个支持
show()
方法的对象,请创建一个
教师
实例。更根本的是,您的继承层次结构被破坏了。教师不是一种类型的学校。你正在混淆继承是如何运作的。每个
教师
对象都有
显示
功能,但不是每个
学校
对象。当然,把
教师
变成
学校
的一个子类是个坏主意。
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
super(Vehicle, self).drive(x, y)