1面向对象什么是面向对象?例如,要生产一个柜子,需要三个属性:1)柜子形状2)柜子尺寸3)柜子油漆4)柜子功能-储物生产出来的柜子是它的一个对象,或者实例。这是面向对象的。在程序中:类类是一个抽象的概念,是对一切事物的抽象,是一类事物共同特征的集合。对象实例和对象对象是类的特殊性,一个实体*属性,是对象状态的抽象*操作,是对象行为类ClassName:语句块#1的抽象Python类的定义。必须使用class关键字#2.类名必须用大驼峰命名#3.类定义完成后,生成一个类对象绑定到ClassName上。示例1classMyClass:"""Aexampleclass"""x='abc'#ClassAttributedeffoo(self):#Classattribute,alsomethodprint(self.x)return'MyClass'#类本身是也是一个对象,所以叫类对象,所以也有自己的属性和方法)#通过__dict__()可以查看类拥有的属性和方法。这个对象也有类似类的函数''''outputresultabcAexampleclassMyClass{'__module__':'__main__','__doc__':'Aexampleclass','x':'abc','foo':,'__dict__':,'__weakref__':}'''Example2classPerson:COUNTRY="China"def__init__(self,name,age,address):#使用双下划线表示私有化,外部不能直接访问#当然Python中的私有化只是falseprivate,这将是self.__name=nameself.__age=年龄self.address=地址defgetName(self):returnself.__namedefsetName(self,name):self.__name=namedefgetAge(self):returnself.__agedefsetAge(self,age):self.__age=agedefgetAddress(self):returnself.addressdefsetAddress(self,address):self.address=addressif__name__=='__main__':p=Person("张三",22,"北京")#例子转换一个变量,先隐藏调用__new__()创建实例,然后调用__init()__初始化name=p.getName()#因为是私有变量,不能直接通过p.__name获取,提供的需要调用Methodage=p.getAge()address=p.address#p.address没有私有化,可以用print(f"Name:{name},Age:{age},address:{address}")#前面说python中的private是falseprivate,这是怎么回事?我们通过p.__dict__看一下print(p.__dict__)#output{'_Person__name':'张三','_Person__age':22,'address':'北京'}#python原来的私有化改了name,然后我们调用print(p._Person__name)#虽然可以这样调用,但是在正式环境中还是要慎用#类有__dict__,对象也有,我们也可以访问类中的属性throughobjects,print(p.COUNTRY)#那么查找对象的属性的顺序是怎样的呢?#实例使用。访问属性,会先找自己的dict,找不到就找上层类的dict#如果直接用__dict__[变量名]访问变量不会按照上面的顺序查找,如下print(p.__dict__['address'])2封装和组装:将数据和操作组装在一起隐藏数据:只对外暴露一些接口,通过接口访问对象。如上例,就是封装的体现3装饰一个类的例子defsetnameproperty(name):def_setnameproperty(cls):cls.NAME=namereturncls#mustreturnclassreturn_setnameproperty@setnameproperty('MyClass')classMyClass:passprint(MyClass.NAME)print(MyClass.__dict__)类方法和静态方法defsetnameproperty(name):def_setnameproperty(cls):cls.NAME=namereturncls#returnclassreturn_setnameproperty@setnameproperty('MyClass')classMyClass:x=123def__init__(self):print('init')deffoo(self):return'foo'@staticmethod#用这个装饰器装饰的方法是静态方法defbar():print('bar')@classmethod#用这个装饰器装饰的方法就是类方法defclsmtd(cls):print('{}'sx=={}'.format(cls.__name__,cls.x))#print(MyClass.NAME)#print(MyClass.__dict__)MyClass.bar()print(MyClass.__dict__)MyClass.clsmtd()a=MyClass()a.clsmtd()#implicitlya.__class__.clsmtd()类方法是等价的统计java中的ic方法是java中的类方法,但是Python不一样。python中的静态方法指的是一般函数,属于此类,但不能从实质上归入此类。Python有一个单独的类方法。可以理解为这个类中命名的一个方法,很少用到。类方法,不需要实例化,只要类定义存在,就可以调用ClassName.clsmtd()ClassName().clsmtd()访问控制公共属性(public)私有属性(Private):两个下划线代表私有,但是nottruePrivate,其实质是Python解释器把它改成了_类名__变量名保护(Protect)一个下划线是约定俗成的,叫做保护变量。5__del__方法可以定义在对象的析构类中,称为析构函数(方法)。作用:类实例销毁时调用,释放占用的资源。由于Python实现了垃圾回收机制,所以无法确定该方法是否适合执行。,必要时使用del语句删除实例,手动调用此方法。6.方法重载在其他高级面向对象语言中,都有重载的概念。所谓重载,就是方法名相同,但参数的个数和类型不同,是同一个方法的重载。但是Python只有重写,没有重载!在Python中,在方法(函数)定义中,形参非常灵活,不需要指定类型。即使指定了类型,也只是描述而不是约束。参数个数不固定(可变参数)。一个函数定义可以实现多种不同形式的实参调用。所以Python不需要方法重载。7类继承Python3所有类父类都是Object视图的特殊属性和继承方法:属性描述\_base_class基类\_bases_class基类tuple\_mro_display方法查找顺序,基类Tuple\__subclasses__()类子类列表Python支持多重继承Python使用MRO(methonresolutionorder)来解决baseclasssearchorderMRO有三种搜索算法1)经典算法,从左到右,深度优先策略2)New-styleclassesAlgorithm,经典算法的升级,只有最后一个一个被反复保存。3)C3算法在类创建时计算出一个MRO有序表。2.3版本后支持,Python3唯一支持的算法。例子#父类或超类#在Python3中,object是所有类的父类,默认定义的类都继承这个对象class#但是在定义类的时候,还是直接写成classPerson(object):def__init__(self,name,age):self.__name=nameself.__age=agedefeat(self):print("eat")defsleep(self):print("sleep")#子类继承父类Student(Person):def__init__(self,name,age,school):super().__init__(name,age)#使用super关键字调用父类的init方法self.__school=schooldefeat(self):#重写父类方法print("在学校食堂吃饭")deflearn(self):print("在课堂上学习")stu=Student("张三",18,"北京大学")stu.eat()stu.sleep()#虽然子类中没有实现sleep()方法,但是继承了父类,所以可以直接调用stu.learn()"""在学校食堂吃饭睡觉,上课学习"""8Polymorphism多态性:不同ent子类对调用相同的父类方法产生不同的执行结果。多态性可以增加代码的灵活性。前提是继承重写父类方法。示例1classPerson(object):def__init__(self,name):self.name=namedefworking(self,):passclassTeacher(Person):def__init__(self,name):super().__init__(name)defwrking(self):print("Iamateacher")classStudent(Person):def__init__(self,name):super().__init__(name)defwrking(self):print("IamaStudent")#1.创建一个Teacher对象和一个Student对象teacher=Teacher()student=Student()teacher.working()student.working()例子2:classAnimal(object):deffood(self):passclassDog(Animal):deffood(self):return"Bone"classCat(Animal):deffood(self):return"fish"classPerson(object):deffeedAnimal(self,animalObject):food=animalObject.food()print(f"feed{food}")如果__name__=='__main__':#多态的体现p=Person()dog=Dog()cat=Cat()p.feedAnimal(dog)p.feedAnimal(cat)封装、继承、多态是面向对象的三要素