班级(班级)|2类的基本内容,包括类定义、类对象、实例对象、方法对象、类和实例变量。下面这篇文章有基本的介绍:https://blog.csdn.net/weixin_45642918/article/details/104579523今天这篇文章主要介绍类继承和私有变量。继承Python支持类的继承。以下是派生类的定义:classDerivedClassName(BaseClassName):。..其中基类BaseClassName和派生类必须在同一范围内定义。其他任意表达式也可以代替基类名称。例如,当基类定义在另一个模块中时:classDerivedClassName(modname.BaseClassName):派生类的执行过程与基类相同。在构造类对象时,其实是先记录了基类。解析属性引用时:如果在派生类中没有找到请求的属性,则从基类中查找。如果继承的基类也派生自其他类,则递归应用此规则。派生类实例化也没什么特别的:DerivedClassName()创建该类的一个新实例。方法引用解析如下:查找对应的类属性,如果有必要,逐级向下查找基类继承链。如果生成了一个函数对象,方法引用就会生效。例如:>>>classAnimal:...defrun(self):...print('Animalisrunning')...>>>classDog(Animal):...pass...>>>d=Dog()>>>d.run()Animalisrunning这里,Dog继承了Animal基类,Dog()新建一个实例赋值给d,在调用run方法时,Dog类并没有有对应的方法,于是在基类Animal中查找,Animal中有这个方法,生成一个函数对象,引用生效。返回的结果是基类方法的内容。派生类是可以覆盖基类方法的类。因为在调用同一个对象的其他方法时,基类方法没有其他特殊权限。因此,基类的方法调用同一基类中定义的另一个方法可能最终会调用重写它的派生类的方法。上面例子中Dog没有对应的方法,现在写一个和run同名的方法,看调用结果:>>>classAnimal:...defrun(self):...print('Animalisrunning')...>>>classDog(Animal):...defrun(self):...print('Dogisrunning')...>>>d=Dog()>>>d.run()Dogisrunning这里,Dog类的run()方法覆盖了基类Animal的run()方法。调用run()方法时,会先调用子类重载的方法。但是派生类中的重载方法实际上可能想要扩展而不是简单地替换同名的基类方法。但是有一种方法可以简单地调用基类方法:BaseClassName.methodname(self,arguments)。(这里需要注意的是,只有在全局范围内可以通过该名称访问基类BaseClassName时,该方法才会生效。)例如:>>>classAnimal:...defrun(self):...print('动物正在奔跑')...>>>classDog(Animal):...defrun(self):...print('Dogisrunning')...>>>d=Dog()>>>d.run()Dogisrunning>>>Animal.run(d)AnimalisrunningAnimal.run(d)直接调用基类的方法。多重继承Python也支持多重继承。具有多个基类的派生类定义如下:classDerivedClassName(Base1,Base2,Base3):。..在最简单的情况下,搜索从基类继承属性的操作它是深度优先的,从左到右。当存在重叠层级时,不会在同一个类中查找两次。具体可能的情况:当某个属性在DerivedClassName中没有找到时,会先在基类Base1中查找,然后在Base1的基类中递归查找,如果没有查找到Base2,以此类推。但实际情况可能更复杂:方法解析顺序会动态变化以支持对super()的协同调用。详情请参考以下资料https://www.python.org/download/releases/2.3/mro/Privatevariables实际上,严格限制只能从对象内部访问的“私有”实例变量是不存在的在Python中。但是,大多数Python代码遵循以下约定:带下划线的名称(例如_spam)应被视为API的非公共部分(无论它是函数、方法还是数据成员)。为了避免名称与子类定义的名称发生冲突,Python支持这种机制,称为名称重整。__spam形式的标识符(至少有两个前导下划线和最多一个尾随下划线)将替换为_classname__spam,其中classname是没有前导下划线的当前类名。这种对名称修饰的支持可以帮助子类覆盖方法而不破坏类内方法调用。例如:classMapping:def__init__(self,iterable):self.items_list=[]self.__update(iterable)defupdate(self,iterable):foriteminiterable:self.items_list.append(item)#原始方法update()privatecopy__update=updateclassMappingSubclass(Mapping):defupdate(self,keys,values):#为update()提供新功能#但不会破坏__init__()foriteminzip(keys,values):self.items_list.append(item)在上面的例子中,即使MappingSubclass引入了__update标识,也不会报错,因为在Mapping中已经被_Mapping__update替代,被MappingSubclass_MappingSubclass__update替代。这里注意:重写规则的设计主要是为了避免冲突。这也使得修改或访问被认为是私有的变量成为可能。在某些特殊情况下可能会有用。但同时也需要注意,除非必要,不要直接访问或修改这些被认为是私有的变量。以上是关于类(Class)的继承和私有变量。欢迎关注微信公众号《书所集录》