coding:UTF8封装是面向对象的三大特性封装指的是隐藏对象中的一些不希望被外部所访问到的属性或方法如何去隐藏一个对象的属性?将对象的属性名,修改为一个外部不知道的名字如何获取(修改)对象中的属性?需要提供一个getter和setter方法,使外部可以访问到属性getter获取对象中指定属性(get属性名)setter用来设置对象的指定属性(set属性名)使用封装,确实是增加了类定义的复杂程度,但是他也确保了数据的安全性1,隐藏了属性名,使调用者无法随意的修改对象中的属性2,增加了getter和setter方法,很好的控制的属性是否只读的如果希望属性是只读的,则可以直接去掉setter方法如果希望属性是不能被外部访问,则可以直接去掉getter方法。3,使用setter方法设置属性,可以增加数据的验证,确保数据的值正确性。4,使用getter方法获取属性,使用setter方法设置属性可以在读取属性和修改属性的同时做一些其他处理4,classDog:definit(self,name,age):self。hiddennamenameself。hiddenageagedefsayhello(self):print(大家好,我是sself。hiddenname)defgetname(self):returnself。hiddennamedefsetname(self,name):print(设置对象属性)self。hiddennamenamedefgetage(self):print(获取对象属性)returnself。hiddenagedefsetage(self,age):ifage0:print(设置对象属性)self。hiddennameagedDog(旺财,8)d。sayhello()d。setname(小黑)print(d。getname())coding:UTF8classRectangle:definit(self,width,height):self。hiddenwidthwidthself。hiddenheightheightdefgetwidth(self):returnself。hiddenwidthdefgetheight(self):returnself。hiddenheightdefsetwidth(self,width):self。hiddenwidthwidthdefsetheight(self,height):self。hiddenheightheightdefgetarea(self):returnself。hiddenwidthself。hiddenheightrRectangle(5,2)r。setheight(20)r。setwidth(10)print(r。getarea())可以为对象的属性使用双下划线开头,xxxx双下划线开头的属性,是对象的隐藏属性,隐藏属性只能在类的内部访问,无法通过对象访问。其实隐藏属性只不过是python自动为属性改了一个名字其实上将名字改为了,类名属性名,比如namePersonnameclassPerson:definit(self,name):self。namenamedefgetname(self):returnself。namedefsetname(self,name):self。namenamepPerson(tom)print(p。name)开头的属性时隐藏属性,无法通过对象访问p。namelilip。Personnameliliprint(p。getname())使用开头的属性,实际上仍然可以在外部访问,所以这种方式我们一般不用一般我们会将一些私有属性(不希望被外部访问的属性)以开头一般情况下,以开头的属性都是私有属性,没有特性需求不要修改私有属性classPerson:definit(self,name):self。namenamedefgetname(self):returnself。namedefsetname(self,name):self。namenamepPerson(孙悟空)print(p。name)coding:UTF8classPerson:definit(self,name,age):self。namenameself。ageageproperty装饰器,用来将一个get方法,转换为对象的属性添加为prperty装饰器以后,我们就可以将像调用属性一样使用get方法propertydefname(self):print(get方法执行)returnself。namesetter方法的装饰器:属性名。settername。setterdefname(self,name):print(setter方法执行)self。namenamepropertydefage(self):print(get方法执行)returnself。agesetter方法的装饰器:属性名。settername。setterdefage(self,age):print(setter方法执行)self。ageagepPerson(孙悟空,28)p。name猪八戒p。age23print(p。name,p。age)coding:UTF8继承定义个类animal这个类中需要两个方法:run(),sleep()classAnimal:defrun(self):print(动物会跑)defsleep(self):print(动物会睡觉)defbark(self):print()定义一个类:Dog这个类中需要三个方法:run(),sleep(),bark()classDog:defrun(self):print(狗会跑)defsleep(self):print(狗会睡觉)defbark(self):print(狗会叫)有一个类,能够实现我们需要的大部分功能,但是不能实现我们的全部功能如何让这个类实现我们的全部功能呢1,直接修改这个类,在这个类中添加我们的需要功能修改起来比较麻烦,并且会违反OCP规则2,直接创建一个新的类创建一个新的类比较麻烦,并且需要大量的进行复制粘贴,导致大量重复性代码3,直接从Animal类中来继承她的属性和方法继承是面向对象的三大特性通过继承我们可以使一个类获取到其他类中的属性和方法在定义类时,可以在类名后的括号中指定当前类的父类(超类,基类,supper)子类(衍生类)可以直接继承父类汇总的所有的属性和方法通过继承可以直接获取到父类的方法或属性,避免重复代码,并且也符合OCP规则所以我们经常需要通过经常对一个类进行扩展classDog(Animal):defbark(self):print(狗会叫)classHashiqi(Dog):deffansha(self):print(我是一只傻傻的哈士奇)dDog()hHashiqi()h。fansha()d。run()d。sleep()d。bark()print(d)flagisinstance(d,Dog)flagisinstance(d,Animal)print(flag)在创建类时,如果省略了父类,则默认父类为objectobject是所有类的父类,所有都继承自objectclassPerson(object):passissubclass()检查一个类是否是另一个类的子类print(issubclass(Animal,Dog))print(issubclass(Dog,object))print(issubclass(Person,object))isinstance()用来检查一个对象是否是一个类的实例如果这个类是这个对象的父类,也会返回true所有对象都是object的实例print(isinstance(Dog,object))