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