当前位置: 首页 > 后端技术 > Python

python-object-oriented-17-继承-对象类-mro方法

时间:2023-03-26 13:34:56 Python

1.继承的基本概念继承是面向对象程序设计的一个重要特征,是实现“代码重用”的重要手段。如果一个新的类继承自一个设计好的类,将直接具有已有类的特性,大大降低了工作难度,因为很多事情父类已经做好了,没必要再做一遍,减少重复劳动。现有类称为父类或基类,新类称为子类或派生类。继承关系示意图:继承语法格式:类子类类名[(父类1[,父类2,...])]类体结构说明:由于Python语言和C++一样支持多重继承,所有继承时多重类是可以继承的。备注:关于多重继承的内容,后面的注释会有具体的说明2.对象类2.1对象基本描述在python中,所有的类都继承自类对象,也称为根类。定义类时,只有类名,没有继承相关的参数,此时默认继承类对象。从另一个角度看,所有类继承关系的最上层是类对象,类对象是所有类的父类,所有类的公共默认实现都定义在对象类中,如:__new__()、__init__()等等非常常见的方法。2.2mro方法定义defmro(self,*args,**kwargs):#真实签名未知"""返回一个类型的方法解析顺序。"""pass返回该类型方法的解析顺序,对应继承关系班级的。2.3示例代码classPerson:passclassStudent(Person):passprint("使用mro函数")print(Student.mro())print("--"*20)print("使用__mro__属性")print(Student.__mro__)运行结果:使用mro函数[,,]------------------------------------------使用__mro__属性(,,)代码说明:使用mro方法和__mro__属性,两者运行结果一致,说明底层相同。其中之一属于包装装饰功能。在代码中,我们首先定义了类Person,没有指定继承关系;然后定义类Student,并显示继承类Person;在运行结果中,首先是类Student本身,然后是类Person,这是因为我们展示了继承的原因。最后一个是类对象,解释一次。如果不指定继承关系,则默认继承类object3。继承过程中的注意事项定义子类时,必须在其构造函数中调用父类的构造函数。调用格式如下:父类名.__init__(self[,parameterlist])通过继承获得的父类的私有属性和私有方法不能直接使用,只能通过子类对象名._parent来执行类名__私有属性名传递。示例代码:classPerson:def__init__(self,name,age):self.name=nameself.__age=agedefsay_age(self):print(self.name,"Theageis:",self.__age,sep="")classStudent(Person):def__init__(self,name,age,score):self.score=score#手动调用父类Person的__init__方法.__init__(self,name,age)print("使用继承自父类的公共属性和方法")s1=Student("聂法军",100,100)print("s1.name=",s1.name,sep='')s1.say_age()print("使用从父类继承的私有属性和方法")print(dir(s1))print(s1._Person__age)print(s1.age)结果:Traceback(最近调用last):文件“test.py”,line27,inprint(s1.age)AttributeError:'Student'objecthasnoattribute'age'使用从父类继承的公共属性和方法属性和方法['_Person__age','__class__','__delattr__','__dict__','__dir__','__doc__','__eq__','__format__','__ge__','__getattribute__','__gt__','__hash__','__init__','__init_subclass__','__le__','__lt__','__module__','__ne__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__','name','say_age','score']6代码说明:类Student继承对于Person类,需要手动调用父类的__init__方法,因为这不是__new__方法,是初始化方法,不是真正生成对象的方法,所以不会自动执行,需要手动调用子类Student使用父类Person的公共属性和公共方法say_age()都可以正常使用,说明子类通过继承可以正常使用父类的公共方法和属性。但是最后在使用父类Person继承的私有属性__age的时候,报错了,说明通过继承,子类不能使用父类的私有属性和私有方法。备注:更多精彩博客请访问:聂法军技术博客对应视频教程请访问:python400完整markdown笔记请访问:python400_learn_github